Basic PI contact transient, 3 October 2026

A fresh simulation requires SoftRobot dynamic_pi_2d.py matching the commit and SHA-256 in contact-provenance.json. Solver source is not included. Replaying the supplied NPZ does not require that source or PyTorch.

With Python, NumPy, CPU PyTorch, Matplotlib and ffmpeg available:
OPENBLAS_NUM_THREADS=1 OMP_NUM_THREADS=1 python generate_contact_media.py --source /path/to/SoftRobot/src/softrobot/contact/dynamic_pi_2d.py --ffmpeg /path/to/ffmpeg --output-dir /path/to/new-output

To re-render the supplied raw result, keep contact-result.npz in the output directory and add --reuse-result.

This is a 0.12 s transient demo, not an equilibrium or accuracy benchmark. The solver permits a small Newton step as a stopping condition; not every recorded residual is below its nominal residual tolerance. Video frames are sequential recorded states, slowed down and not real-time.

Independent replay: python generate_contact_media.py --reuse-result --ffmpeg /path/to/ffmpeg --output-dir /path/to/extracted-package
