Lyman-α at high B

Three scripts computing H Lyman-α (n=2→1) at increasing magnetic field — 100 T, 500 T, and 1000 T — exploring the transition from the intermediate-field to the Paschen-Back regime. Conditions are \(N_e = 5\times10^{25}\) m-3, \(T_e = 100\) eV throughout, with no Doppler or instrumental convolution (pure Stark-Zeeman profile). Each script’s title is loosely inspired by Figure 3 of Ferri, Peyrusse & Calisti (2022) — note that figure was computed for C VI (Z = 6), not H; these scripts use H (Z = 1), so absolute splittings and widths differ from the published figure.

B = 100 T (test_lyman_alpha.py)

  1#!/usr/bin/env python3
  2"""
  3H Lyman-alpha Stark-Zeeman Splitting at B = 100 T
  4
  5Illustrates the polarization structure of Lyman-alpha (n=2 -> n=1) under
  6plasma conditions loosely inspired by the Figure 3 benchmark of Ferri,
  7Peyrusse & Calisti (2022, DOI: 10.1063/5.0058552) — note that figure was
  8computed for C VI (Z = 6), not H; this script uses H (Z = 1) throughout, so
  9absolute splittings and widths differ from the published figure.
 10
 11Conditions:
 12  - Radiator: H (Z = 1), Lyman-alpha (n=2 -> n=1)
 13  - B = 100 T
 14  - Ne = 5e25 m^-3
 15  - Te = 100 eV
 16  - No Doppler or instrumental convolution (pure Stark-Zeeman profile)
 17
 18The pi component is multiplied by -1 for visual separation of polarizations.
 19The x-axis is energy detuning (eV) from the unperturbed transition center E0.
 20"""
 21
 22import os
 23import sys
 24import numpy as np
 25import matplotlib.pyplot as plt
 26
 27# Ensure starkzee package is in path
 28sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), "..")))
 29
 30from starkzee.utils import energy_ev_to_wavelength_nm, RYDBERG_EV
 31from starkzee.static_profile import calculate_static_profile
 32
 33
 34def run_lyman_alpha_test():
 35    # ── Physical parameters (loosely inspired by paper Fig. 3, but H not C VI) ─
 36    Z  = 1        # Hydrogen
 37    B  = 100.0    # Tesla
 38    Ne = 5e25     # m^-3
 39    Te = 100.0    # eV
 40
 41    # Unperturbed Lyman-alpha transition energy for H: n=2 -> n=1
 42    E_upper = -(Z**2) * RYDBERG_EV / 4.0   # n=2 level
 43    E_lower = -(Z**2) * RYDBERG_EV          # n=1 level
 44    E0 = E_upper - E_lower                  # ~10.2 eV for H
 45
 46    # Energy grid: ±0.20 eV around E0
 47    detuning_grid = np.linspace(-0.2, 0.2, 500)
 48    energies_ev   = E0 + detuning_grid
 49
 50    print("=" * 70)
 51    print("test_lyman_alpha: H Lyman-alpha Stark-Zeeman at B = 100 T")
 52    print(f"  Z={Z}, B={B} T, Ne={Ne:.1e} m^-3, Te={Te} eV")
 53    print(f"  Unperturbed center E0 = {E0:.6f} eV  "
 54          f"({energy_ev_to_wavelength_nm(E0):.6f} nm)")
 55    print("=" * 70)
 56
 57    # ── Compute static (unconvolved) Stark-Zeeman profile ──────────────────
 58    print("-> Computing static Stark-Zeeman profile (unconvolved)…")
 59    pi, sig_plus, sig_minus = calculate_static_profile(
 60        n_u=2, n_l=1, Z=Z, B=B, Ne_m3=Ne, Te_ev=Te,
 61        energies_ev=energies_ev,
 62        num_f=30, num_mu=10,
 63        use_screening=True,
 64        quadratic_zeeman=True,
 65        frequency_dependent_width=True,
 66    )
 67
 68    # ── Plot — Figure 3 layout ──────────────────────────────────────────────
 69    fig, ax = plt.subplots(figsize=(9, 6))
 70
 71    ax.plot(detuning_grid, sig_plus,  color='#10b981', linewidth=2.2,
 72            label=r'$\sigma_+$  ($q = +1$)')
 73    ax.plot(detuning_grid, sig_minus, color='#f59e0b', linewidth=2.2,
 74            label=r'$\sigma_-$  ($q = -1$)')
 75    ax.plot(detuning_grid, -pi,       color='#ef4444', linewidth=2.2,
 76            linestyle='--', label=r'$-\pi$  ($q = 0$)')
 77
 78    ax.axhline(0, color='gray', linestyle=':', linewidth=0.9)
 79    ax.axvline(0, color='gray', linestyle='--', linewidth=0.8, alpha=0.6,
 80               label=f'$E_0 = {E0:.4f}$ eV')
 81
 82    ax.set_title(
 83        f"SZ Lyman-$\\alpha$ of H  (B = {B:.0f} T, "
 84        f"$N_e = {Ne:.0e}$ m$^{{-3}}$, $T_e = {Te:.0f}$ eV)\n"
 85        r"Pure Stark-Zeeman profile",
 86        fontsize=12, pad=12,
 87    )
 88    ax.set_xlabel(r"Energy detuning from $E_0$ (eV)", fontsize=11)
 89    ax.set_ylabel("Intensity (arb. units)", fontsize=11)
 90    ax.set_xlim(-0.2, 0.2)
 91
 92    ax.grid(True, linestyle=':', alpha=0.55)
 93    ax.legend(frameon=True, fontsize=10)
 94
 95    plt.tight_layout()
 96    plot_file = os.path.join(os.path.dirname(__file__), "lyman_alpha_100T.png")
 97    plt.savefig(plot_file, dpi=300)
 98    print(f"Plot saved → {plot_file}")
 99    plt.show()
100
101
102if __name__ == "__main__":
103    run_lyman_alpha_test()
H Lyman-alpha Stark-Zeeman profile at B=100T

π, σ+, σ− components of H Ly-α at B = 100 T (π shown inverted for visual separation).

B = 500 T (test_lyman_alpha_500T.py)

 1#!/usr/bin/env python3
 2"""
 3H Lyman-alpha Stark-Zeeman Splitting at B = 500 T
 4
 5Higher-field companion to test_lyman_alpha.py (100 T), loosely inspired by
 6the Figure 3 benchmark of Ferri, Peyrusse & Calisti (2022,
 7DOI: 10.1063/5.0058552) — that figure used C VI (Z = 6); this script uses
 8H (Z = 1) throughout.
 9
10Conditions:
11  - Radiator: H (Z = 1), Lyman-alpha (n=2 → n=1)
12  - B = 500 T
13  - Ne = 5e25 m^-3
14  - Te = 100 eV
15  - No convolution (pure Stark-Zeeman profile)
16
17Energy range ±0.20 eV around E0.  The pi component is multiplied by -1 for
18visual separation of polarizations.
19"""
20
21import os
22import sys
23import numpy as np
24import matplotlib.pyplot as plt
25
26sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), "..")))
27
28from starkzee.utils import energy_ev_to_wavelength_nm, RYDBERG_EV
29from starkzee.static_profile import calculate_static_profile
30
31
32def run_test():
33    # ── Physical parameters ────────────────────────────────────────────────
34    Z  = 1        # Hydrogen
35    B  = 500.0    # Tesla
36    Ne = 5e25     # m^-3
37    Te = 100.0    # eV
38
39    # Unperturbed Lyman-alpha for H (n=2 → n=1)
40    E0 = (Z**2) * RYDBERG_EV * (1.0 - 1.0/4.0)   # = (3/4) Z² Ry
41
42    # Energy grid: ±0.20 eV around E0
43    detuning_grid = np.linspace(-0.2, 0.2, 600)
44    energies_ev   = E0 + detuning_grid
45
46    print("=" * 70)
47    print("test_lyman_alpha_500T: H Lyman-alpha — B = 500 T")
48    print(f"  Z={Z}, B={B} T, Ne={Ne:.1e} m^-3, Te={Te} eV")
49    print(f"  E0 = {E0:.6f} eV  ({energy_ev_to_wavelength_nm(E0):.6f} nm)")
50    print("=" * 70)
51
52    print("-> Computing static Stark-Zeeman profile (unconvolved)…")
53    pi, sig_plus, sig_minus = calculate_static_profile(
54        n_u=2, n_l=1, Z=Z, B=B, Ne_m3=Ne, Te_ev=Te,
55        energies_ev=energies_ev,
56        num_f=30, num_mu=10,
57        use_screening=True,
58        quadratic_zeeman=True,
59        frequency_dependent_width=True,
60    )
61
62    # ── Plot ───────────────────────────────────────────────────────────────
63    fig, ax = plt.subplots(figsize=(9, 6))
64
65    ax.plot(detuning_grid, sig_plus,  color='#10b981', linewidth=2.2,
66            label=r'$\sigma_+$  ($q = +1$)')
67    ax.plot(detuning_grid, sig_minus, color='#f59e0b', linewidth=2.2,
68            label=r'$\sigma_-$  ($q = -1$)')
69    ax.plot(detuning_grid, -pi,       color='#ef4444', linewidth=2.2,
70            linestyle='--', label=r'$-\pi$  ($q = 0$)')
71
72    ax.axhline(0, color='gray', linestyle=':', linewidth=0.9)
73    ax.axvline(0, color='gray', linestyle='--', linewidth=0.8, alpha=0.6,
74               label=f'$E_0 = {E0:.4f}$ eV')
75
76    ax.set_title(
77        f"SZ Lyman-$\\alpha$ of H  (B = {B:.0f} T, "
78        f"$N_e = {Ne:.0e}$ m$^{{-3}}$, $T_e = {Te:.0f}$ eV)\n"
79        r"Pure Stark-Zeeman profile",
80        fontsize=12, pad=12,
81    )
82    ax.set_xlabel(r"Energy detuning from $E_0$ (eV)", fontsize=11)
83    ax.set_ylabel("Intensity (arb. units)", fontsize=11)
84    ax.set_xlim(detuning_grid.min(), detuning_grid.max())
85
86    ax.grid(True, linestyle=':', alpha=0.55)
87    ax.legend(frameon=True, fontsize=10)
88
89    plt.tight_layout()
90    plot_file = os.path.join(os.path.dirname(__file__), "lyman_alpha_500T.png")
91    plt.savefig(plot_file, dpi=300)
92    print(f"Plot saved → {plot_file}")
93    plt.show()
94
95
96if __name__ == "__main__":
97    run_test()
H Lyman-alpha Stark-Zeeman profile at B=500T

π, σ+, σ− components of H Ly-α at B = 500 T.

B = 1000 T (test_lyman_alpha_1000T.py)

 1#!/usr/bin/env python3
 2"""
 3H Lyman-alpha Stark-Zeeman Splitting at B = 1000 T
 4
 5Highest-field companion to test_lyman_alpha.py / test_lyman_alpha_500T.py,
 6loosely inspired by the Figure 3 benchmark of Ferri, Peyrusse & Calisti
 7(2022, DOI: 10.1063/5.0058552) — that figure used C VI (Z = 6); this script
 8uses H (Z = 1) throughout.
 9
10Conditions:
11  - Radiator: H (Z = 1), Lyman-alpha (n=2 → n=1)
12  - B = 1000 T
13  - Ne = 5e25 m^-3
14  - Te = 100 eV
15  - No convolution (pure Stark-Zeeman profile)
16
17Energy range ±1.0 eV around E0 to accommodate the large Zeeman splitting
18at this extreme field.  The pi component is multiplied by -1 for visual
19separation of polarizations.
20"""
21
22import os
23import sys
24import numpy as np
25import matplotlib.pyplot as plt
26
27sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), "..")))
28
29from starkzee.utils import energy_ev_to_wavelength_nm, RYDBERG_EV
30from starkzee.static_profile import calculate_static_profile
31
32
33def run_test():
34    # ── Physical parameters ────────────────────────────────────────────────
35    Z  = 1        # Hydrogen
36    B  = 1000.0   # Tesla
37    Ne = 5e25     # m^-3
38    Te = 100.0    # eV
39
40    # Unperturbed Lyman-alpha for H (n=2 → n=1)
41    E0 = (Z**2) * RYDBERG_EV * (1.0 - 1.0/4.0)
42
43    # Energy grid: ±1.0 eV around E0
44    detuning_grid = np.linspace(-1.0, 1.0, 800)
45    energies_ev   = E0 + detuning_grid
46
47    print("=" * 70)
48    print("test_lyman_alpha_1000T: H Lyman-alpha — B = 1000 T")
49    print(f"  Z={Z}, B={B} T, Ne={Ne:.1e} m^-3, Te={Te} eV")
50    print(f"  E0 = {E0:.6f} eV  ({energy_ev_to_wavelength_nm(E0):.6f} nm)")
51    print("=" * 70)
52
53    print("-> Computing static Stark-Zeeman profile (unconvolved)…")
54    pi, sig_plus, sig_minus = calculate_static_profile(
55        n_u=2, n_l=1, Z=Z, B=B, Ne_m3=Ne, Te_ev=Te,
56        energies_ev=energies_ev,
57        num_f=30, num_mu=10,
58        use_screening=True,
59        quadratic_zeeman=True,
60        frequency_dependent_width=True,
61    )
62
63    # ── Plot ───────────────────────────────────────────────────────────────
64    fig, ax = plt.subplots(figsize=(9, 6))
65
66    ax.plot(detuning_grid, sig_plus,  color='#10b981', linewidth=2.2,
67            label=r'$\sigma_+$  ($q = +1$)')
68    ax.plot(detuning_grid, sig_minus, color='#f59e0b', linewidth=2.2,
69            label=r'$\sigma_-$  ($q = -1$)')
70    ax.plot(detuning_grid, -pi,       color='#ef4444', linewidth=2.2,
71            linestyle='--', label=r'$-\pi$  ($q = 0$)')
72
73    ax.axhline(0, color='gray', linestyle=':', linewidth=0.9)
74    ax.axvline(0, color='gray', linestyle='--', linewidth=0.8, alpha=0.6,
75               label=f'$E_0 = {E0:.4f}$ eV')
76
77    ax.set_title(
78        f"SZ Lyman-$\\alpha$ of H  (B = {B:.0f} T, "
79        f"$N_e = {Ne:.0e}$ m$^{{-3}}$, $T_e = {Te:.0f}$ eV)\n"
80        r"Pure Stark-Zeeman profile",
81        fontsize=12, pad=12,
82    )
83    ax.set_xlabel(r"Energy detuning from $E_0$ (eV)", fontsize=11)
84    ax.set_ylabel("Intensity (arb. units)", fontsize=11)
85    ax.set_xlim(-1.0, 1.0)
86
87    ax.grid(True, linestyle=':', alpha=0.55)
88    ax.legend(frameon=True, fontsize=10)
89
90    plt.tight_layout()
91    plot_file = os.path.join(os.path.dirname(__file__), "lyman_alpha_1000T.png")
92    plt.savefig(plot_file, dpi=300)
93    print(f"Plot saved → {plot_file}")
94    plt.show()
95
96
97if __name__ == "__main__":
98    run_test()
H Lyman-alpha Stark-Zeeman profile at B=1000T

π, σ+, σ− components of H Ly-α at B = 1000 T.