Lyα MCRT
How does THOR stack up against established Lyα radiative-transfer codes on accuracy and speed?
Run on a single consumer desktop — AMD Ryzen 9 5950X and an NVIDIA RTX 3090 — at
N = 10 000 photons, all -O3: THOR with clang (via AdaptiveCpp), the other codes
with gcc/gfortran. The GPU bar is THOR's FP32 build at N = 10⁶ (enough to
fill the card); the CPU bars are FP64.2
Accuracy
The test is the Neufeld static sphere — a point source at the centre of a static, uniform, dust-free sphere of hydrogen — run against RASCAS, COLT and Iltis. Its emergent Lyα profile has a closed-form solution1, so each code's accuracy is just its R² against it:
Canonical run: τ₀ = 10⁶, T = 2×10⁴ K, xcrit = 0 (no acceleration).
All four codes land on the analytic curve (R² ≈ 0.91–0.96) and agree with each other to ~1.5 %, each doing the ~10⁶ scatterings per photon expected without acceleration.
Iltis
The public cbehren/Iltis is broken for this comparison (spiky spectrum,
R² ≈ 0.6 at τ₀ ≥ 10⁵), so it is not in the default run. Add it with a
maintained (private) voroILTIS build — run_all.sh forwards
ILTIS_URL/ILTIS_REF to the container build:
Run it
TAU10 sets the optical depth; NPHOTONS, RASCAS_NRANKS and --march are
the other knobs.
References
- Neufeld (1990), ApJ 350, 216 — ADS
- Dijkstra, Haiman & Spaans (2006), ApJ 649, 14 — ADS
- Byrohl & Nelson (2025), THOR code paper — see Papers
-
Run 2026-06-05. Code versions — THOR
7449d06a, COLT88429d9, RASCAS3b18dd0, voroILTIS9ae77da(plus local Neufeld-setup modifications not captured by the hash). The public-Iltis container recipe pins3efd87cbut is not used for these figures. ↩