{ "cells": [ { "cell_type": "markdown", "id": "intro", "metadata": {}, "source": [ "# Linear Absorption — Beer–Lambert Law\n", "\n", "When an electromagnetic field is weak enough that it never significantly\n", "depletes the ground-state population, the medium responds linearly: the\n", "field amplitude decays exponentially with propagation distance. This is\n", "the **Beer–Lambert law**,\n", "\n", "$$\n", "I(z, \\omega) = I_0(\\omega)\\,e^{-\\alpha(\\omega)\\,z},\n", "$$\n", "\n", "where the absorption coefficient is $\\alpha(\\omega) := k\\chi_I(\\omega)$\n", "(the wavenumber times the imaginary part of the susceptibility).\n", "Since $I \\propto |\\Omega|^2$ this is equivalent to\n", "\n", "$$\n", "|\\Omega(z, \\omega)| = |\\Omega_0(\\omega)|\\,e^{-\\alpha(\\omega)\\,z/2}.\n", "$$\n", "\n", "For the resonant two-level system $\\alpha(0) = 2Ng/\\Gamma$, giving\n", "$|\\Omega(z)| = |\\Omega_0|\\,e^{-Ng\\,z/\\Gamma}$ at $\\omega = 0$.\n", "We use $\\Omega_0 = 10^{-3}\\,\\Gamma$ throughout.\n", "\n", "This notebook demonstrates:\n", "\n", "1. How increasing optical depth attenuates the pulse.\n", "2. The role of spontaneous decay in reaching a true Beer–Lambert steady state.\n", "3. That the exponential attenuation is independent of pulse shape (Gaussian, CW)." ] }, { "cell_type": "markdown", "id": "parameters", "metadata": {}, "source": [ "## Parameters\n", "\n", "The `interaction_strengths` parameter $Ng$ sets the coupling between field and\n", "medium. It is proportional to atomic density $N$ and the dipole matrix element\n", "squared: $C \\propto N |\\mu|^2 / \\hbar$. In the weak-field limit the resonant\n", "absorption coefficient is $\\alpha \\propto Ng$, so doubling $Ng$ doubles the\n", "optical depth of the medium.\n", "\n", "We will compare three values:\n", "\n", "| $Ng$ | Character |\n", "|---|---|\n", "| 0.1 | Optically thin — pulse passes through almost unchanged |\n", "| 1.0 | Moderate absorption |\n", "| 10.0 | Optically thick — strong attenuation |" ] }, { "cell_type": "code", "execution_count": 1, "id": "imports", "metadata": { "execution": { "iopub.execute_input": "2026-05-05T15:16:52.584721Z", "iopub.status.busy": "2026-05-05T15:16:52.584622Z", "iopub.status.idle": "2026-05-05T15:16:53.226272Z", "shell.execute_reply": "2026-05-05T15:16:53.225819Z" } }, "outputs": [], "source": [ "import numpy as np\n", "import plotly.graph_objects as go\n", "from maxwellbloch import mb_solve, plot" ] }, { "cell_type": "markdown", "id": "low-od-intro", "metadata": {}, "source": [ "## Optically thin medium — $Ng = 0.1$\n", "\n", "With very few atoms the pulse propagates essentially undistorted.\n", "There is a small reduction in amplitude and a slight group delay, but\n", "the pulse shape is preserved." ] }, { "cell_type": "code", "execution_count": 2, "id": "solve-low-od", "metadata": { "execution": { "iopub.execute_input": "2026-05-05T15:16:53.228202Z", "iopub.status.busy": "2026-05-05T15:16:53.228051Z", "iopub.status.idle": "2026-05-05T15:16:53.299506Z", "shell.execute_reply": "2026-05-05T15:16:53.298768Z" } }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "\r", " 0%| | 0/10 [00:00, ?z/s]" ] }, { "name": "stderr", "output_type": "stream", "text": [ "\r", " 10%|█ | 1/10 [00:00<00:00, 689.63z/s, Ω_max=0.00626]" ] }, { "name": "stderr", "output_type": "stream", "text": [ "\r", " 20%|██ | 2/10 [00:00<00:00, 266.52z/s, Ω_max=0.00619]" ] }, { "name": "stderr", "output_type": "stream", "text": [ "\r", " 30%|███ | 3/10 [00:00<00:00, 236.50z/s, Ω_max=0.00612]" ] }, { "name": "stderr", "output_type": "stream", "text": [ "\r", " 40%|████ | 4/10 [00:00<00:00, 215.61z/s, Ω_max=0.00605]" ] }, { "name": "stderr", "output_type": "stream", "text": [ "\r", " 50%|█████ | 5/10 [00:00<00:00, 212.42z/s, Ω_max=0.00599]" ] }, { "name": "stderr", "output_type": "stream", "text": [ "\r", " 60%|██████ | 6/10 [00:00<00:00, 206.47z/s, Ω_max=0.00592]" ] }, { "name": "stderr", "output_type": "stream", "text": [ "\r", " 70%|███████ | 7/10 [00:00<00:00, 199.55z/s, Ω_max=0.00586]" ] }, { "name": "stderr", "output_type": "stream", "text": [ "\r", " 80%|████████ | 8/10 [00:00<00:00, 201.01z/s, Ω_max=0.00579]" ] }, { "name": "stderr", "output_type": "stream", "text": [ "\r", " 90%|█████████ | 9/10 [00:00<00:00, 197.80z/s, Ω_max=0.00576]" ] }, { "name": "stderr", "output_type": "stream", "text": [ "\r", "100%|██████████| 10/10 [00:00<00:00, 194.23z/s, Ω_max=0.00576]" ] }, { "name": "stderr", "output_type": "stream", "text": [ "\r", "100%|██████████| 10/10 [00:00<00:00, 192.43z/s, Ω_max=0.00576]" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Saving MBSolve to mbs-linear-absorption-ng01-decay.qu\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "\n" ] } ], "source": [ "mb_solve_json_ng01 = \"\"\"\n", "{\n", " \"atom\": {\n", " \"fields\": [\n", " {\n", " \"coupled_levels\": [[0, 1]],\n", " \"detuning\": 0.0,\n", " \"rabi_freq\": 1.0e-3,\n", " \"rabi_freq_t_args\": {\"ampl\": 1.0, \"centre\": 0.0, \"fwhm\": 1.0},\n", " \"rabi_freq_t_func\": \"gaussian\"\n", " }\n", " ],\n", " \"num_states\": 2,\n", " \"decays\": [{\"channels\": [[0, 1]], \"rate\": 1.0}]\n", " },\n", " \"t_min\": -2.0,\n", " \"t_max\": 10.0,\n", " \"t_steps\": 100,\n", " \"z_min\": -0.2,\n", " \"z_max\": 1.2,\n", " \"z_steps\": 10,\n", " \"interaction_strengths\": [0.1],\n", " \"savefile\": \"mbs-linear-absorption-ng01-decay\"\n", "}\n", "\"\"\"\n", "\n", "mbs_ng01 = mb_solve.MBSolve().from_json_str(mb_solve_json_ng01)\n", "mbs_ng01.mbsolve(recalc=False);" ] }, { "cell_type": "code", "execution_count": 3, "id": "plot-low-od-spacetime", "metadata": { "execution": { "iopub.execute_input": "2026-05-05T15:16:53.301053Z", "iopub.status.busy": "2026-05-05T15:16:53.300927Z", "iopub.status.idle": "2026-05-05T15:16:53.916962Z", "shell.execute_reply": "2026-05-05T15:16:53.916298Z" } }, "outputs": [ { "data": { "text/html": [ " \n", " \n", " " ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "