How neutrino mass shapes the cosmic web — scientific animation

How neutrino mass shapes the cosmic web — scientific animation

Dark-background, text-free animation (42 s, 1920×1080, 30 fps) of how massive neutrinos suppress the growth of small-scale structure, with matched initial conditions in both panels.

Deliverables (output/)

| File | What | |—|—| | neutrino_mass_cosmic_web.mp4 | H.264, 1920×1080, 30 fps, yuv420p, BT.709, CRF 13 | | final_still_1080p.png | presentation-ready final composition (1920×1080) | | final_still_3840x2160.png | same composition re-rendered at 4K |

Storyboard

| Time | Content | |—|—| | 0–14 s | Two synchronised panels (Σm_ν = 0 and 0.4 eV): early density fluctuations grow into the cosmic web. Same random phases, camera, scale and colour scale. | | 13.5–26 s | Both panels zoom into the same region; three soft rings mark knots whose small-scale contrast differs; sparse tracer particles (right panel) free-stream in straight lines through the evolving structure. | | 26–29 s | Panels zoom out and slide left, graph area opens. | | 29–36.5 s | CAMB curves for Σm_ν = 0.1, 0.2, 0.4 eV are drawn from large to small scales (log k axis, baseline at 1). The 0.4 eV curve, the right panel frame and its label share one colour (orange). The high-k region is gently highlighted. | | 36.5–42 s | Final composition held for 5.5 s. |

Scientific basis and honest caveats

  • Graph = validated data. cosmology.py runs CAMB (linear theory) for Σm_ν = 0, 0.1, 0.2, 0.4 eV with the same ω_m = 0.143, ω_b = 0.0224, h = 0.675, A_s = 2.1×10⁻⁹, n_s = 0.965 (only the CDM/neutrino split changes, 3 degenerate species) and plots P_tot(k, z=0) / P_tot,massless(k, z=0). High-k plateaus: 0.938, 0.869, 0.738.
  • Panels = qualitative illustration. Particles follow a truncated Zel’dovich displacement of a Gaussian random field (webcore.py). The massive panel multiplies each Fourier band by the CAMB growth-suppression factor sqrt(R(k, z)) at every epoch, so large scales are identical and small scales grow less. Two illustration parameters in config.py are not physical values:
    • AMP = 1.25 — overall amplitude, compensating the Zel’dovich approximation’s missing late-time collapse.
    • BOOST = 3.0 — exaggerates the log of the suppression so the 0.4 eV difference is visible at a glance (the real effect is ~13 % in amplitude). Set BOOST = 1.0 for the unexaggerated CAMB suppression. No numerical suppression values are shown in the panels.
  • Neutrinos are never drawn destroying structures. Tracers move ballistically at speeds drawn from one fixed distribution; they are shown only in the massive panel and their speeds do not depend on mass.

Rebuild

python -m venv .venv && .venv/bin/pip install -r requirements.txt
.venv/bin/python cosmology.py           # CAMB spectra -> data/camb_spectra.npz
.venv/bin/python animate.py prep        # zoom region + ring positions -> data/scene.json
.venv/bin/python animate.py preview 6 14 22 31 38   # stills -> output/preview/
.venv/bin/python animate.py render      # MP4 (about 8 min on an M-series Mac)
.venv/bin/python animate.py still       # final still;  --scale 2 for 3840x2160

cache/ (≈1 GB of Fourier-synthesised displacement bands) is regenerated automatically on first use.

Files

  • config.py — timeline, layout, colours, illustration parameters (the editable “project” settings)
  • cosmology.py — CAMB spectra · webcore.py — web engine · style.py — palette and density→colour map
  • animate.py — scene composition, frame renderer, ffmpeg encoding