{ "cells": [ { "cell_type": "markdown", "id": "sit-title", "metadata": {}, "source": [ "# Self-Induced Transparency: Area Theorem and Solitons\n", "\n", "The **McCall–Hahn area theorem** governs how the pulse area $\\mathcal{A} = \\int_{-\\infty}^\\infty \\Omega(t)\\,dt$ evolves as a pulse propagates through a resonant absorbing medium:\n", "\n", "$$\\frac{d\\mathcal{A}}{dz} = -\\frac{\\alpha}{2}\\sin\\mathcal{A}$$\n", "\n", "This has the same form as the equation of motion for a pendulum, and its fixed points tell us everything about what happens to any pulse entering the medium:\n", "\n", "| Fixed point | Stability | Outcome |\n", "|:-----------:|:---------:|--------|\n", "| 0 | stable | weak pulses absorbed |\n", "| π | unstable | pulses tip toward 0 or 2π |\n", "| 2π | stable | **SIT soliton** propagates without loss |\n", "| 3π | unstable | one 2π soliton emitted |\n", "| 4π | stable | two 2π solitons |\n", "| … | | |\n", "\n", "Even multiples of π are stable: a pulse with area near $2n\\pi$ reshapes toward exactly $2n\\pi$, splitting into $n$ **solitons** that propagate without attenuation. This is **self-induced transparency** (SIT). Odd multiples are unstable saddle points.\n", "\n", "The area theorem is also **shape-independent**: only the integrated area matters, not the pulse envelope. A Gaussian with area $1.8\\pi$ reshapes toward $2\\pi$ just as a sech pulse does.\n", "\n", "This notebook demonstrates the full picture, starting from the fundamental SIT soliton and then exploring what the area theorem predicts for other input areas." ] }, { "cell_type": "code", "execution_count": 1, "id": "sit-setup", "metadata": { "execution": { "iopub.execute_input": "2026-05-05T15:14:02.104177Z", "iopub.status.busy": "2026-05-05T15:14:02.103979Z", "iopub.status.idle": "2026-05-05T15:14:02.757305Z", "shell.execute_reply": "2026-05-05T15:14:02.756707Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "t_width=0.001, t_min=-0.0100, t_max=0.0400, interaction_strength=5000.0\n" ] } ], "source": [ "import numpy as np\n", "from maxwellbloch import mb_solve, plot\n", "\n", "from maxwellbloch.utility import SECH_FWHM_CONV\n", "t_width = 0.001\n", "t_min = -t_width * 10\n", "t_max = t_width * 40\n", "interaction_strength = 5 / t_width\n", "gauss_fwhm = t_width / SECH_FWHM_CONV\n", "print(f\"t_width={t_width}, t_min={t_min:.4f}, t_max={t_max:.4f}, interaction_strength={interaction_strength:.1f}\")" ] }, { "cell_type": "markdown", "id": "sit-2pi-intro", "metadata": {}, "source": [ "## The 2π SIT soliton\n", "\n", "A sech pulse with area exactly $2\\pi$ is the **central object of self-induced transparency**. It is an exact analytical solution of the Maxwell-Bloch equations: it propagates through the resonant medium without any attenuation, slowed relative to vacuum by a delay proportional to the optical depth. The medium absorbs energy from the leading edge and re-emits it coherently into the trailing edge — the two processes cancel exactly.\n", "\n", "This is the stable fixed point at $\\mathcal{A} = 2\\pi$. All other inputs are understood in relation to it." ] }, { "cell_type": "code", "execution_count": 2, "id": "sit-2pi-json", "metadata": { "execution": { "iopub.execute_input": "2026-05-05T15:14:02.759107Z", "iopub.status.busy": "2026-05-05T15:14:02.758948Z", "iopub.status.idle": "2026-05-05T15:14:02.766397Z", "shell.execute_reply": "2026-05-05T15:14:02.765964Z" } }, "outputs": [], "source": [ "mbs_2pi = mb_solve.MBSolve().from_json_str(f\"\"\"\n", "{{\n", " \"atom\": {{\n", " \"fields\": [{{\"coupled_levels\": [[0, 1]], \"rabi_freq_t_func\": \"sech\",\n", " \"rabi_freq_t_args\": {{\"n_pi\": 2.0, \"centre\": 0.0, \"width\": {t_width}}}}}],\n", " \"num_states\": 2,\n", " \"decays\": [{{\"channels\": [[0, 1]], \"rate\": 1.0}}]\n", " }},\n", " \"t_min\": {t_min}, \"t_max\": {t_max}, \"t_steps\": 500,\n", " \"z_min\": -0.5, \"z_max\": 1.5, \"z_steps\": 200,\n", " \"interaction_strengths\": [{interaction_strength}], \"savefile\": \"mbs-sit-2pi\"\n", "}}\n", "\"\"\"\n", ")\n", "mbs_2pi.mbsolve(recalc=False);" ] }, { "cell_type": "code", "execution_count": 3, "id": "sit-2pi-spacetime", "metadata": { "execution": { "iopub.execute_input": "2026-05-05T15:14:02.767829Z", "iopub.status.busy": "2026-05-05T15:14:02.767748Z", "iopub.status.idle": "2026-05-05T15:14:03.388435Z", "shell.execute_reply": "2026-05-05T15:14:03.387616Z" } }, "outputs": [ { "data": { "text/html": [ " \n", " \n", " " ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
\n", "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig = plot.field_spacetime(mbs_2pi, show_z_bounds=[0, 1])\n", "fig.update_layout(title=\"2π sech — SIT soliton propagates without loss\")\n", "fig.show(renderer='notebook_connected')" ] }, { "cell_type": "code", "execution_count": 4, "id": "sit-2pi-area", "metadata": { "execution": { "iopub.execute_input": "2026-05-05T15:14:03.392381Z", "iopub.status.busy": "2026-05-05T15:14:03.392266Z", "iopub.status.idle": "2026-05-05T15:14:03.411063Z", "shell.execute_reply": "2026-05-05T15:14:03.410299Z" } }, "outputs": [ { "data": { "text/html": [ " \n", " \n", " " ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
\n", "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig = plot.pulse_area(mbs_2pi)\n", "fig.update_layout(title=\"2π sech — area constant throughout\", yaxis_range=[0, 4])\n", "fig.show(renderer='notebook_connected')" ] }, { "cell_type": "markdown", "id": "sit-1pi-intro", "metadata": {}, "source": [ "## 1π — absorbed\n", "\n", "A sech pulse with area $\\mathcal{A} < \\pi$ lies in the basin of attraction of the zero fixed point: it is simply absorbed. There is no coherent re-emission to balance the absorption, so the pulse decays monotonically as it propagates. The pulse area tracks the area theorem prediction, falling smoothly toward zero." ] }, { "cell_type": "code", "execution_count": 5, "id": "sit-1pi-json", "metadata": { "execution": { "iopub.execute_input": "2026-05-05T15:14:03.412805Z", "iopub.status.busy": "2026-05-05T15:14:03.412696Z", "iopub.status.idle": "2026-05-05T15:14:03.420596Z", "shell.execute_reply": "2026-05-05T15:14:03.419764Z" } }, "outputs": [], "source": [ "mbs_1pi = mb_solve.MBSolve().from_json_str(f\"\"\"\n", "{{\n", " \"atom\": {{\n", " \"fields\": [{{\"coupled_levels\": [[0, 1]], \"rabi_freq_t_func\": \"sech\",\n", " \"rabi_freq_t_args\": {{\"n_pi\": 1.0, \"centre\": 0.0, \"width\": {t_width}}}}}],\n", " \"num_states\": 2,\n", " \"decays\": [{{\"channels\": [[0, 1]], \"rate\": 1.0}}]\n", " }},\n", " \"t_min\": {t_min}, \"t_max\": {t_max}, \"t_steps\": 500,\n", " \"z_min\": -0.5, \"z_max\": 1.5, \"z_steps\": 200,\n", " \"interaction_strengths\": [{interaction_strength}], \"savefile\": \"mbs-sit-1pi\"\n", "}}\n", "\"\"\"\n", ")\n", "mbs_1pi.mbsolve(recalc=False);" ] }, { "cell_type": "code", "execution_count": 6, "id": "sit-1pi-spacetime", "metadata": { "execution": { "iopub.execute_input": "2026-05-05T15:14:03.422394Z", "iopub.status.busy": "2026-05-05T15:14:03.422271Z", "iopub.status.idle": "2026-05-05T15:14:03.447904Z", "shell.execute_reply": "2026-05-05T15:14:03.447368Z" } }, "outputs": [ { "data": { "text/html": [ " \n", " \n", " " ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
\n", "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig = plot.field_spacetime(mbs_1pi, show_z_bounds=[0, 1])\n", "fig.update_layout(title=\"1π sech — absorbed\")\n", "fig.show(renderer='notebook_connected')" ] }, { "cell_type": "code", "execution_count": 7, "id": "sit-1pi-area", "metadata": { "execution": { "iopub.execute_input": "2026-05-05T15:14:03.451250Z", "iopub.status.busy": "2026-05-05T15:14:03.451147Z", "iopub.status.idle": "2026-05-05T15:14:03.468731Z", "shell.execute_reply": "2026-05-05T15:14:03.468240Z" } }, "outputs": [ { "data": { "text/html": [ " \n", " \n", " " ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
\n", "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig = plot.pulse_area(mbs_1pi)\n", "fig.update_layout(title=\"1π sech — area decays to 0\", yaxis_range=[0, 4])\n", "fig.show(renderer='notebook_connected')" ] }, { "cell_type": "markdown", "id": "sit-3pi-intro", "metadata": {}, "source": [ "## 3π — one 2π soliton emitted\n", "\n", "The $3\\pi$ fixed point is **unstable**: any perturbation drives the area away from it. Propagation tips a $3\\pi$ input downward toward the nearest stable point at $2\\pi$. One $2\\pi$ soliton forms and the remaining area ($3\\pi - 2\\pi = \\pi$) falls below the unstable fixed point at $\\pi$ and is absorbed. The area plot shows the transition clearly." ] }, { "cell_type": "code", "execution_count": 8, "id": "sit-3pi-json", "metadata": { "execution": { "iopub.execute_input": "2026-05-05T15:14:03.470850Z", "iopub.status.busy": "2026-05-05T15:14:03.470717Z", "iopub.status.idle": "2026-05-05T15:14:03.478048Z", "shell.execute_reply": "2026-05-05T15:14:03.477587Z" } }, "outputs": [], "source": [ "mbs_3pi = mb_solve.MBSolve().from_json_str(f\"\"\"\n", "{{\n", " \"atom\": {{\n", " \"fields\": [{{\"coupled_levels\": [[0, 1]], \"rabi_freq_t_func\": \"sech\",\n", " \"rabi_freq_t_args\": {{\"n_pi\": 3.0, \"centre\": 0.0, \"width\": {t_width}}}}}],\n", " \"num_states\": 2,\n", " \"decays\": [{{\"channels\": [[0, 1]], \"rate\": 1.0}}]\n", " }},\n", " \"t_min\": {t_min}, \"t_max\": {t_max}, \"t_steps\": 500,\n", " \"z_min\": -0.5, \"z_max\": 1.5, \"z_steps\": 200,\n", " \"interaction_strengths\": [{interaction_strength}], \"savefile\": \"mbs-sit-3pi\"\n", "}}\n", "\"\"\"\n", ")\n", "mbs_3pi.mbsolve(recalc=False);" ] }, { "cell_type": "code", "execution_count": 9, "id": "sit-3pi-spacetime", "metadata": { "execution": { "iopub.execute_input": "2026-05-05T15:14:03.479923Z", "iopub.status.busy": "2026-05-05T15:14:03.479815Z", "iopub.status.idle": "2026-05-05T15:14:03.504522Z", "shell.execute_reply": "2026-05-05T15:14:03.503717Z" } }, "outputs": [ { "data": { "text/html": [ " \n", " \n", " " ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
\n", "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig = plot.field_spacetime(mbs_3pi, show_z_bounds=[0, 1])\n", "fig.update_layout(title=\"3π sech — reshapes to one 2π soliton\")\n", "fig.show(renderer='notebook_connected')" ] }, { "cell_type": "code", "execution_count": 10, "id": "sit-3pi-area", "metadata": { "execution": { "iopub.execute_input": "2026-05-05T15:14:03.507581Z", "iopub.status.busy": "2026-05-05T15:14:03.507478Z", "iopub.status.idle": "2026-05-05T15:14:03.524847Z", "shell.execute_reply": "2026-05-05T15:14:03.524465Z" } }, "outputs": [ { "data": { "text/html": [ " \n", " \n", " " ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
\n", "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig = plot.pulse_area(mbs_3pi)\n", "fig.update_layout(title=\"3π sech — area settles at 2π\", yaxis_range=[0, 4])\n", "fig.show(renderer='notebook_connected')" ] }, { "cell_type": "markdown", "id": "sit-shape-intro", "metadata": {}, "source": [ "## Shape independence — Gaussian pulses\n", "\n", "The area theorem contains no information about pulse shape — only $\\mathcal{A}$ appears in $d\\mathcal{A}/dz = -(\\alpha/2)\\sin\\mathcal{A}$. A Gaussian, square, or any other envelope with the same area undergoes the same fate. A $1.8\\pi$ Gaussian reshapes toward the $2\\pi$ sech soliton, just as a $1.8\\pi$ sech pulse would — the attractor depends only on the area, not the shape." ] }, { "cell_type": "code", "execution_count": 11, "id": "sit-g18-json", "metadata": { "execution": { "iopub.execute_input": "2026-05-05T15:14:03.526206Z", "iopub.status.busy": "2026-05-05T15:14:03.526119Z", "iopub.status.idle": "2026-05-05T15:14:03.533999Z", "shell.execute_reply": "2026-05-05T15:14:03.533576Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Input area: 1.800π\n" ] } ], "source": [ "mbs_g18 = mb_solve.MBSolve().from_json_str(f\"\"\"\n", "{{\n", " \"atom\": {{\n", " \"fields\": [{{\"coupled_levels\": [[0, 1]], \"rabi_freq_t_func\": \"gaussian\",\n", " \"rabi_freq_t_args\": {{\"n_pi\": 1.8, \"centre\": 0.0, \"fwhm\": {gauss_fwhm}}}}}],\n", " \"num_states\": 2,\n", " \"decays\": [{{\"channels\": [[0, 1]], \"rate\": 1.0}}]\n", " }},\n", " \"t_min\": {t_min}, \"t_max\": {t_max}, \"t_steps\": 500,\n", " \"z_min\": -0.5, \"z_max\": 1.5, \"z_steps\": 200,\n", " \"interaction_strengths\": [{interaction_strength}], \"savefile\": \"mbs-sit-gauss-18pi\"\n", "}}\n", "\"\"\"\n", ")\n", "mbs_g18.mbsolve(recalc=False)\n", "print(f\"Input area: {np.trapezoid(mbs_g18.Omegas_zt[0, 0, :].real, mbs_g18.tlist) / np.pi:.3f}π\")" ] }, { "cell_type": "code", "execution_count": 12, "id": "sit-g18-spacetime", "metadata": { "execution": { "iopub.execute_input": "2026-05-05T15:14:03.535296Z", "iopub.status.busy": "2026-05-05T15:14:03.535220Z", "iopub.status.idle": "2026-05-05T15:14:03.559415Z", "shell.execute_reply": "2026-05-05T15:14:03.558908Z" } }, "outputs": [ { "data": { "text/html": [ " \n", " \n", " " ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
\n", "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig = plot.field_spacetime(mbs_g18, show_z_bounds=[0, 1])\n", "fig.update_layout(title=\"1.8π Gaussian — reshapes toward 2π soliton\")\n", "fig.show(renderer='notebook_connected')" ] }, { "cell_type": "code", "execution_count": 13, "id": "sit-g18-area", "metadata": { "execution": { "iopub.execute_input": "2026-05-05T15:14:03.563237Z", "iopub.status.busy": "2026-05-05T15:14:03.563098Z", "iopub.status.idle": "2026-05-05T15:14:03.579584Z", "shell.execute_reply": "2026-05-05T15:14:03.579094Z" } }, "outputs": [ { "data": { "text/html": [ " \n", " \n", " " ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
\n", "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig = plot.pulse_area(mbs_g18)\n", "fig.update_layout(title=\"1.8π Gaussian — area asymptotes to 2π\", yaxis_range=[0, 3])\n", "fig.show(renderer='notebook_connected')" ] }, { "cell_type": "markdown", "id": "sit-g18-analysis", "metadata": {}, "source": [ "The $1.8\\pi$ Gaussian reshapes toward $2\\pi$ just as a sech pulse does. The attractor is always the same $2\\pi$ sech soliton regardless of input shape — the pulse distorts in transit, shedding the excess as radiation. Having established the area theorem for single-soliton outcomes, we now look at inputs large enough to produce multiple solitons." ] }, { "cell_type": "markdown", "id": "sit-4pi-intro", "metadata": {}, "source": [ "## 4π — two solitons\n", "\n", "A $4\\pi$ input is near a second stable fixed point. It breaks into **two** $2\\pi$ solitons, each carrying half the original area. The two solitons emerge with different widths and therefore different group velocities — the narrower soliton travels faster — so they separate as they propagate through the medium." ] }, { "cell_type": "code", "execution_count": 14, "id": "sit-4pi-json", "metadata": { "execution": { "iopub.execute_input": "2026-05-05T15:14:03.581193Z", "iopub.status.busy": "2026-05-05T15:14:03.581102Z", "iopub.status.idle": "2026-05-05T15:14:03.588695Z", "shell.execute_reply": "2026-05-05T15:14:03.588185Z" } }, "outputs": [], "source": [ "mbs_4pi = mb_solve.MBSolve().from_json_str(f\"\"\"\n", "{{\n", " \"atom\": {{\n", " \"fields\": [{{\"coupled_levels\": [[0, 1]], \"rabi_freq_t_func\": \"sech\",\n", " \"rabi_freq_t_args\": {{\"n_pi\": 4.0, \"centre\": 0.0, \"width\": {t_width}}}}}],\n", " \"num_states\": 2,\n", " \"decays\": [{{\"channels\": [[0, 1]], \"rate\": 1.0}}]\n", " }},\n", " \"t_min\": {t_min}, \"t_max\": {t_max}, \"t_steps\": 500,\n", " \"z_min\": -0.5, \"z_max\": 1.5, \"z_steps\": 200,\n", " \"interaction_strengths\": [{interaction_strength}], \"savefile\": \"mbs-sit-4pi\"\n", "}}\n", "\"\"\"\n", ")\n", "mbs_4pi.mbsolve(recalc=False);" ] }, { "cell_type": "code", "execution_count": 15, "id": "sit-4pi-spacetime", "metadata": { "execution": { "iopub.execute_input": "2026-05-05T15:14:03.590206Z", "iopub.status.busy": "2026-05-05T15:14:03.590127Z", "iopub.status.idle": "2026-05-05T15:14:03.614213Z", "shell.execute_reply": "2026-05-05T15:14:03.613763Z" } }, "outputs": [ { "data": { "text/html": [ " \n", " \n", " " ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
\n", "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig = plot.field_spacetime(mbs_4pi, show_z_bounds=[0, 1])\n", "fig.update_layout(title=\"4π sech — breaks into two 2π solitons\")\n", "fig.show(renderer='notebook_connected')" ] }, { "cell_type": "code", "execution_count": 16, "id": "sit-4pi-area", "metadata": { "execution": { "iopub.execute_input": "2026-05-05T15:14:03.617872Z", "iopub.status.busy": "2026-05-05T15:14:03.617778Z", "iopub.status.idle": "2026-05-05T15:14:03.633715Z", "shell.execute_reply": "2026-05-05T15:14:03.633321Z" } }, "outputs": [ { "data": { "text/html": [ " \n", " \n", " " ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
\n", "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig = plot.pulse_area(mbs_4pi)\n", "fig.update_layout(title=\"4π sech — total area conserved\", yaxis_range=[0, 6])\n", "fig.show(renderer='notebook_connected')" ] }, { "cell_type": "markdown", "id": "sit-6pi-intro", "metadata": {}, "source": [ "## 6π — three solitons\n", "\n", "A $6\\pi$ input breaks into **three** $2\\pi$ solitons. The general rule is clear: a $2n\\pi$ input produces exactly $n$ solitons. The solitons again emerge with different widths and speeds, fanning out as they propagate." ] }, { "cell_type": "code", "execution_count": 17, "id": "sit-6pi-json", "metadata": { "execution": { "iopub.execute_input": "2026-05-05T15:14:03.635164Z", "iopub.status.busy": "2026-05-05T15:14:03.635073Z", "iopub.status.idle": "2026-05-05T15:14:03.642326Z", "shell.execute_reply": "2026-05-05T15:14:03.641921Z" } }, "outputs": [], "source": [ "mbs_6pi = mb_solve.MBSolve().from_json_str(f\"\"\"\n", "{{\n", " \"atom\": {{\n", " \"fields\": [{{\"coupled_levels\": [[0, 1]], \"rabi_freq_t_func\": \"sech\",\n", " \"rabi_freq_t_args\": {{\"n_pi\": 6.0, \"centre\": 0.0, \"width\": {t_width}}}}}],\n", " \"num_states\": 2,\n", " \"decays\": [{{\"channels\": [[0, 1]], \"rate\": 1.0}}]\n", " }},\n", " \"t_min\": {t_min}, \"t_max\": {t_max}, \"t_steps\": 500,\n", " \"z_min\": -0.5, \"z_max\": 1.5, \"z_steps\": 200, \"z_steps_inner\": 2,\n", " \"interaction_strengths\": [{interaction_strength}], \"savefile\": \"mbs-sit-6pi\"\n", "}}\n", "\"\"\"\n", ")\n", "mbs_6pi.mbsolve(recalc=False);" ] }, { "cell_type": "code", "execution_count": 18, "id": "sit-6pi-spacetime", "metadata": { "execution": { "iopub.execute_input": "2026-05-05T15:14:03.643709Z", "iopub.status.busy": "2026-05-05T15:14:03.643633Z", "iopub.status.idle": "2026-05-05T15:14:03.668035Z", "shell.execute_reply": "2026-05-05T15:14:03.667406Z" } }, "outputs": [ { "data": { "text/html": [ " \n", " \n", " " ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
\n", "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig = plot.field_spacetime(mbs_6pi, show_z_bounds=[0, 1])\n", "fig.update_layout(title=\"6π sech — breaks into three 2π solitons\")\n", "fig.show(renderer='notebook_connected')" ] }, { "cell_type": "code", "execution_count": 19, "id": "sit-6pi-area", "metadata": { "execution": { "iopub.execute_input": "2026-05-05T15:14:03.672016Z", "iopub.status.busy": "2026-05-05T15:14:03.671875Z", "iopub.status.idle": "2026-05-05T15:14:03.687984Z", "shell.execute_reply": "2026-05-05T15:14:03.687380Z" } }, "outputs": [ { "data": { "text/html": [ " \n", " \n", " " ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
\n", "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig = plot.pulse_area(mbs_6pi)\n", "fig.update_layout(title=\"6π sech — total area conserved\", yaxis_range=[0, 8])\n", "fig.show(renderer='notebook_connected')" ] }, { "cell_type": "markdown", "id": "sit-collision-intro", "metadata": {}, "source": [ "## Soliton collision\n", "\n", "The Maxwell-Bloch equations in the sharp-line limit are integrable, which means SIT solitons collide **elastically**: two solitons passing through each other emerge with their original shapes and speeds intact, shifted only in position. A wide (slow) and a narrow (fast) $2\\pi$ soliton are launched together so the faster one overtakes the slower inside the medium." ] }, { "cell_type": "code", "execution_count": 20, "id": "sit-collision-json", "metadata": { "execution": { "iopub.execute_input": "2026-05-05T15:14:03.689408Z", "iopub.status.busy": "2026-05-05T15:14:03.689310Z", "iopub.status.idle": "2026-05-05T15:14:03.692962Z", "shell.execute_reply": "2026-05-05T15:14:03.692396Z" } }, "outputs": [], "source": [ "t_width_wide = 2.0 * t_width\n", "t_width_narrow = 1.0 * t_width\n", "t_max_col = t_width * 80\n", "\n", "mbs_col = mb_solve.MBSolve().from_json_str(f\"\"\"\n", "{{\n", " \"atom\": {{\"fields\": [{{\"coupled_levels\": [[0, 1]]}}], \"num_states\": 2, \"decays\": [{{\"channels\": [[0, 1]], \"rate\": 1.0}}]}},\n", " \"t_min\": {t_min}, \"t_max\": {t_max_col}, \"t_steps\": 500,\n", " \"z_min\": -0.5, \"z_max\": 1.5, \"z_steps\": 200,\n", " \"interaction_strengths\": [{interaction_strength}], \"savefile\": \"mbs-sit-collision\"\n", "}}\n", "\"\"\"\n", ")" ] }, { "cell_type": "code", "execution_count": 21, "id": "sit-collision-setup", "metadata": { "execution": { "iopub.execute_input": "2026-05-05T15:14:03.694215Z", "iopub.status.busy": "2026-05-05T15:14:03.694106Z", "iopub.status.idle": "2026-05-05T15:14:03.700924Z", "shell.execute_reply": "2026-05-05T15:14:03.700508Z" } }, "outputs": [], "source": [ "from maxwellbloch import t_funcs\n", "\n", "probe = mbs_col.atom.fields[0]\n", "probe.rabi_freq_t_func = lambda t, args: t_funcs.sech(1)(t, args) + t_funcs.sech(2)(t, args)\n", "probe.rabi_freq_t_args = {\n", " \"n_pi_1\": 2.0, \"centre_1\": 0.0, \"width_1\": t_width_wide,\n", " \"n_pi_2\": 2.0, \"centre_2\": t_width * 5, \"width_2\": t_width_narrow,\n", "}\n", "mbs_col.atom.build_operators()\n", "mbs_col.init_Omegas_zt()\n", "mbs_col.mbsolve(recalc=False);" ] }, { "cell_type": "code", "execution_count": 22, "id": "sit-collision-spacetime", "metadata": { "execution": { "iopub.execute_input": "2026-05-05T15:14:03.702342Z", "iopub.status.busy": "2026-05-05T15:14:03.702242Z", "iopub.status.idle": "2026-05-05T15:14:03.725785Z", "shell.execute_reply": "2026-05-05T15:14:03.725213Z" } }, "outputs": [ { "data": { "text/html": [ " \n", " \n", " " ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
\n", "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig = plot.field_spacetime(mbs_col, show_z_bounds=[0, 1])\n", "fig.update_layout(title=\"2π soliton collision — elastic scattering\")\n", "fig.show(renderer='notebook_connected')" ] }, { "cell_type": "markdown", "id": "sit-collision-analysis", "metadata": {}, "source": [ "The two solitons briefly merge into a high-amplitude transient, then re-emerge unchanged in width and speed. The only lasting effect is a position shift — each soliton arrives slightly earlier or later than it would have without the collision. This is the hallmark of elastic, soliton-preserving scattering." ] }, { "cell_type": "markdown", "id": "sit-summary", "metadata": {}, "source": [ "## Summary\n", "\n", "| Input | Outcome |\n", "|:-----:|--------|\n", "| 2π sech | SIT soliton — propagates without loss |\n", "| 1π sech | absorbed |\n", "| 3π sech | one 2π soliton emitted, remainder absorbed |\n", "| 1.8π Gaussian | reshapes toward 2π (shape-independent) |\n", "| 4π sech | two 2π solitons |\n", "| 6π sech | three 2π solitons |\n", "\n", "The area theorem unifies all of these: $d\\mathcal{A}/dz = -(\\alpha/2)\\sin\\mathcal{A}$ has a pendulum-like fixed-point structure, and the SIT soliton is the $2\\pi$ stable fixed point realised as an exact propagating solution. Soliton collisions are elastic because the underlying equations are integrable.\n", "\n", "## References\n", "\n", "1. S. L. McCall, E. L. Hahn, *Self-Induced Transparency by Pulsed Coherent Light*, PRL **18**, 908 (1967).\n", "2. S. L. McCall, E. L. Hahn, *Self-Induced Transparency*, Phys. Rev. **183**, 457 (1969).\n", "3. L. Allen, J. H. Eberly, *Optical Resonance and Two-Level Atoms* (Dover, 1987), Ch. 4." ] } ], "metadata": { "kernelspec": { "display_name": "maxwellbloch", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.14.4" } }, "nbformat": 4, "nbformat_minor": 5 }