Two-Level: Odd-π Sech Pulses — Area Theorem

The McCall–Hahn area theorem governs how the pulse area \(\mathcal{A}(z) = \int_{-\infty}^{\infty} \Omega(z,t)\,dt\) evolves as a pulse propagates through a resonant two-level absorber. For a purely absorbing medium the area satisfies

\[\frac{d\mathcal{A}}{dz} = -\frac{\alpha}{2}\sin\mathcal{A},\]

where \(\alpha\) is the resonant absorption coefficient. The stable fixed points are even multiples of \(\pi\) (including zero); odd multiples of \(\pi\) are unstable saddle points.

Input area

Fate

\(1\pi\)

absorbed toward \(0\pi\)

\(3\pi\)

breaks into one \(2\pi\) soliton (residual \(1\pi\) absorbed)

\(5\pi\)

breaks into two \(2\pi\) solitons (residual \(1\pi\) absorbed)

This notebook demonstrates all three cases using identical sech-pulse envelopes that differ only in their initial area.

Parameters

The sech pulse \(\Omega(t) = \Omega_0\,\text{sech}(t/t_w)\) has pulse area \(\mathcal{A} = \pi\,\Omega_0\,t_w\). Setting n_pi in the JSON config scales \(\Omega_0\) so that the area is exactly \(n\pi\) at \(z = z_\mathrm{min}\).

The medium optical depth is set by interaction_strengths. Here we use \(C = 10\) (optically thick) so that the soliton structure is pronounced.

[1]:
import numpy as np
from maxwellbloch import mb_solve, plot

SECH_FWHM_CONV = 1.0 / 2.6339157938
t_width = 1.0 * SECH_FWHM_CONV  # sech width in γ⁻¹
print(f"t_width = {t_width:.4f} γ⁻¹")
t_width = 0.3797 γ⁻¹

1π pulse — absorbed

A pulse with area below \(2\pi\) cannot form a self-induced transparency soliton. The area decays monotonically to zero: the pulse is absorbed by the medium.

[2]:
mb_solve_json_1pi = """
{
  "atom": {
    "fields": [
      {
        "coupled_levels": [[0, 1]],
        "rabi_freq_t_args": {"n_pi": 1.0, "centre": 0.0, "width": %f},
        "rabi_freq_t_func": "sech"
      }
    ],
    "num_states": 2
  },
  "t_min": -2.0,
  "t_max": 10.0,
  "t_steps": 240,
  "z_min": -0.5,
  "z_max": 1.5,
  "z_steps": 100,
  "interaction_strengths": [10.0],
  "savefile": "mbs-two-sech-1pi"
}
""" % t_width

mbs_1pi = mb_solve.MBSolve().from_json_str(mb_solve_json_1pi)
print(f"Input area: {np.trapezoid(mbs_1pi.Omegas_zt[0, 0, :].real, mbs_1pi.tlist) / np.pi:.4f} π")
mbs_1pi.mbsolve(recalc=False);
Input area: 0.9967 π
/home/docs/checkouts/readthedocs.org/user_builds/maxwellbloch/envs/v0.11.0/lib/python3.11/site-packages/maxwellbloch/mb_solve.py:344: UserWarning: Savefile was built with maxwellbloch==0.10.0, current version is 0.11.0.
  self.load_results()
[3]:
fig = plot.field_spacetime(mbs_1pi)
fig.update_layout(title="|Ω(z, t)| — 1π sech pulse")
fig.show(renderer='notebook_connected')
[4]:
fig = plot.pulse_area(mbs_1pi)
fig.update_layout(title="Pulse area vs z — 1π sech (absorbed toward 0π)")
fig.show(renderer='notebook_connected')

3π pulse — one 2π soliton emitted

The \(3\pi\) input is an unstable fixed point of the area equation. Any perturbation (including numerical discretisation) tips it toward the nearest stable attractor. The lower \(2\pi\) attractor ‘wins’: the pulse emits a single SIT soliton and the residual \(1\pi\) component is absorbed.

[5]:
mb_solve_json_3pi = """
{
  "atom": {
    "fields": [
      {
        "coupled_levels": [[0, 1]],
        "rabi_freq_t_args": {"n_pi": 3.0, "centre": 0.0, "width": %f},
        "rabi_freq_t_func": "sech"
      }
    ],
    "num_states": 2
  },
  "t_min": -2.0,
  "t_max": 10.0,
  "t_steps": 240,
  "z_min": -0.5,
  "z_max": 1.5,
  "z_steps": 100,
  "interaction_strengths": [10.0],
  "savefile": "mbs-two-sech-3pi"
}
""" % t_width

mbs_3pi = mb_solve.MBSolve().from_json_str(mb_solve_json_3pi)
print(f"Input area: {np.trapezoid(mbs_3pi.Omegas_zt[0, 0, :].real, mbs_3pi.tlist) / np.pi:.4f} π")
mbs_3pi.mbsolve(recalc=False);
Input area: 2.9901 π
/home/docs/checkouts/readthedocs.org/user_builds/maxwellbloch/envs/v0.11.0/lib/python3.11/site-packages/maxwellbloch/mb_solve.py:344: UserWarning: Savefile was built with maxwellbloch==0.10.0, current version is 0.11.0.
  self.load_results()
[6]:
fig = plot.field_spacetime(mbs_3pi)
fig.update_layout(title="|Ω(z, t)| — 3π sech pulse")
fig.show(renderer='notebook_connected')
[7]:
fig = plot.pulse_area(mbs_3pi)
fig.update_layout(title="Pulse area vs z — 3π sech (emits one 2π soliton)")
fig.show(renderer='notebook_connected')

5π pulse — two 2π solitons emitted

The \(5\pi\) pulse breaks into two \(2\pi\) solitons. Each soliton has a different width (and therefore a different group velocity — solitons with larger area travel faster), so they separate as they propagate through the medium.

[8]:
mb_solve_json_5pi = """
{
  "atom": {
    "fields": [
      {
        "coupled_levels": [[0, 1]],
        "rabi_freq_t_args": {"n_pi": 5.0, "centre": 0.0, "width": %f},
        "rabi_freq_t_func": "sech"
      }
    ],
    "num_states": 2
  },
  "t_min": -2.0,
  "t_max": 10.0,
  "t_steps": 240,
  "z_min": -0.5,
  "z_max": 1.5,
  "z_steps": 100,
  "interaction_strengths": [10.0],
  "savefile": "mbs-two-sech-5pi"
}
""" % t_width

mbs_5pi = mb_solve.MBSolve().from_json_str(mb_solve_json_5pi)
print(f"Input area: {np.trapezoid(mbs_5pi.Omegas_zt[0, 0, :].real, mbs_5pi.tlist) / np.pi:.4f} π")
mbs_5pi.mbsolve(recalc=False);
Input area: 4.9836 π
/home/docs/checkouts/readthedocs.org/user_builds/maxwellbloch/envs/v0.11.0/lib/python3.11/site-packages/maxwellbloch/mb_solve.py:344: UserWarning: Savefile was built with maxwellbloch==0.10.0, current version is 0.11.0.
  self.load_results()
[9]:
fig = plot.field_spacetime(mbs_5pi)
fig.update_layout(title="|Ω(z, t)| — 5π sech pulse")
fig.show(renderer='notebook_connected')
[10]:
fig = plot.pulse_area(mbs_5pi)
fig.update_layout(title="Pulse area vs z — 5π sech (emits two 2π solitons)")
fig.show(renderer='notebook_connected')

Summary

The area theorem is confirmed in all three cases:

  • : area decays monotonically to 0 — the pulse is absorbed.

  • : area first rises slightly as the soliton forms, then the soliton exits the medium at \(2\pi\) while the residual component is absorbed.

  • : two \(2\pi\) solitons are clearly visible in the space-time plot; the faster (narrower) soliton separates from the slower one, and the area converges to \(4\pi\) at the exit.

The general rule: an \(n\pi\) pulse with \(n\) odd exits with \((n-1)\) solitons, each carrying \(2\pi\) area.

References

      1. McCall and E. L. Hahn, Self-Induced Transparency by Pulsed Coherent Light, PRL 18, 908 (1967). Original area theorem.

      1. McCall and E. L. Hahn, Self-Induced Transparency, Phys. Rev. 183, 457 (1969). Full theory.