memcpy_htod_async needs page-locked host memory. MovingTables allocates one pinned FP64 buffer at construction (manager.py action pattern) and rewrites it only when the records change; every upload is followed by a stream sync in Simulation._run_moving before the next one, so no copy is in flight when it is reused. The advance test fixture now binds the real LBMStepper.step. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>