This 2D version keeps the same real sensible-heat physics as the 3D silo, collapsed to a single lumped sand mass so the whole charge → store → discharge cycle can be integrated and charted directly.
Charging: dT/dt = P_charge/(m·c) − k·(T−T_amb)
Idle: dT/dt = −k·(T−T_amb)
Discharge: dT/dt = −(P_draw + k·(T−T_amb))/(m·c)
Stored Q: Q = m·c·(T−T_amb) k = U_loss / insulation
Every animation frame calls the same step function that integrates this ODE with the real electric power you set (resistive heating is P = I²R delivered as heat, so "charge power" here already is that I²R term), the real insulation-scaled ambient-loss term, and — while discharging — a real heat-extraction rate that pulls stored thermal energy back out. Because the loss term never turns off, holding the silo idle for longer, or with worse insulation, always leaves less stored heat by the time discharge starts.
- Charge / Idle / Discharge — drive the model live, frame by frame, so you can feel the lag between heater input and temperature rise.
- Run full cycle — instantly integrates a complete charge (to ~90% design temperature) → idle (your Storage Duration) → discharge (until the exchanger can no longer sustain its draw) sequence with a fine timestep, plots the whole T(t) trace, and reports the measured round-trip efficiency = energy extracted ÷ energy charged.
- Storage Duration — how long the full-cycle run holds the silo idle between charge and discharge; longer holds bleed more heat to ambient before you can get it back, so efficiency drops — verified numerically by comparing runs at 0 h vs. 240 h idle at the same insulation setting.
- Insulation Quality — scales the loss coefficient k; a poorer jacket (lower ×) raises k and degrades round-trip efficiency the same way a longer idle time does.