1Four phases, three model families, one pack
Each downstream phase answers a different question about the same pack, and every one of them eats Phase 0's output. Gradients from the differentiable solver flow forward too: they benchmark the PINN inverse problem and enable solver-in-the-loop fine-tuning of the operators.
2Anatomy of one time step
Prismatic cells sit on a voxel grid: in-plane conductivity 25 W/mK, only 2 W/mK through the stack, so heat prefers to run along a cell rather than across its neighbors. Interface material (TIM) bridges cells; foam fills the margins. Coolant channels run under the floor, and each channel warms as it flows, so downstream cells always run hotter. Heat enters through the Bernardi equation:
Every step launches three Warp kernels in order, and because each is pure Warp, the composition is a single differentiable program:
3Live pack simulation
This is the same numerical method as the Warp solver, running a 2D cross-section in your browser: explicit FTCS, harmonic-mean face conductivities, Bernardi heating from a looping synthetic drive cycle, convective floor cooling. Inject a fault and watch the field respond. Hot spots take tens of simulated seconds to develop, exactly why early detection needs a model, not a threshold.
4Results: the solver at work
Everything below is real output embedded from the Phase 0 runs, not an illustration. The scenario shown is the degraded-TIM fault: 300 seconds of drive cycle on the 50,400-voxel demo pack, about 4 seconds of wall time per scenario on CPU.
5Backpropagating through 240 time steps
Warp records every kernel launch on a tape, then replays exact adjoints in reverse. A sensor-mismatch loss at the end of a rollout therefore has a gradient with respect to each cell's internal resistance, through every diffusion step, every coolant march, every heat-source evaluation in between.
The experiment: one cell carries a 3× resistance fault. Six surface thermocouples, sampled every 10 seconds with noise, feed 40 Adam iterations. Press play to replay the actual optimization trace:
6Verification gate
run_all.bat and run_all.sh execute the pipeline end to end and stop at scripts/verify.py, which exits nonzero on any failure, so it doubles as a CI gate. Current status of every check: