Room and window
A 2D vertical slice: 4 × 3 m room, 10 cm wall, and 1.5 m of exterior air on each side. Each window frame spans 90–210 cm above the floor. Choose Bottom to open upward from the sill, or Top to open downward from the frame’s upper edge. A 15 cm setting means a 15 cm-high horizontal slot. Bottom and Top simplify a sliding sash. Crack switches to Tilt: the pane hinges at the bottom and its top moves 10 cm into the room. Adjust its inward top gap from 10 to 30 cm (about 5–14°). The insulated tilted pane blocks the computed flow; air passes around its upper edge. The 2D slice omits the side gaps of a real tilt window. Geometry extends uniformly through the omitted depth.
Both rooms start at rest. Walls and closed glazing are insulated and store no heat. Distant reservoirs supply air at the chosen outdoor temperature. Closed walls use idealized slip boundaries and have no heat storage. Wind applies to both rooms; set its speed to zero for buoyancy alone.
Radiators
Radiator placement is independent of window configuration. “Beneath left window” is on the left; “opposite wall” is on the right, beneath the second window when present. Each radiator is a solid obstacle, 60 cm high and 15 cm deep, 15 cm above the floor and 5 cm from its wall. Either or both radiators can be enabled, each with its own maintained surface temperature from 30 to 90 °C. Heat enters neighboring air through q″ = h(Tsurface − Tair), with an assumed h = 8 W/(m²·K). Actual heat output depends on nearby air temperature; this is not a comparison at fixed wattage. Thermal radiation and radiator warm-up are omitted.
Thermostat and energy
Each room can use continuous heating or a thermostat that controls both installed radiators together. Drag the sensor to read a local 5 cm air cell; coordinates are measured from the indoor left wall and floor. Sensor limits keep it clear of radiators and tilted panes. Below target − 0.25 °C, heating switches on; above target + 0.25 °C, it switches off. Within that band it keeps its previous state (initially on). The decision is evaluated every physical time step on either solver. Setpoint and placement changes apply live.
When on, each radiator uses its own selected surface temperature. When off, it stays a solid obstacle with zero heat transfer. There is no stored radiator heat or warm-up/cool-down delay. The meter integrates the actual signed convective heat flux with the same time integrator as air temperature. Watts and watt-hours are for 1 m of omitted depth, not whole-room energy or electrical/fuel consumption. Negative heat means air is warmer than an active surface and transfers heat back to it. Live edits retain accumulated heat; Reset starts from zero. Export includes heat, sensor readings and controller state over time.
Fans
Each room has an independent fan: left, middle, or right; blowing up, down, left, or right. Its center height is adjustable separately in each room from 0.25 to 2.75 m above the floor, in 5 cm steps (initially 1.20 m). These limits keep the actuator at least 5 cm clear of the floor and ceiling in every direction. Horizontal positions are 0.6, 2.0, or 3.4 m from the room’s left wall. The fan is a 40 cm-wide idealized actuator, spread over 20 cm along its axis. It adds local momentum before the pressure solve; the flow, return circulation, and heat mixing are then computed.
Power is a 0–100% strength setting, not electrical wattage. The assumed fan curve is Δp = 2 Pa × max(0, s − (max(U, 0)/(2 m/s))²), where s is the setting divided by 100 and U is the weighted axial air speed through the actuator. At full setting, pressure rise is 2 Pa at zero flow and falls to zero at 2 m/s. A smooth spatial weighting spreads the force, with air density 1.2 kg/m³. Zero power adds no force. Blade rotation, housing blockage, motor heat, and fan noise are omitted; this is not a calibrated commercial fan. The fan symbol marks location and direction; airflow arrows show the solved velocity.
Pressure–flow fan model ↗ · Actuator momentum sources ↗
Wind and fresh air
Each room has a window on each side. Set either opening to 0 cm to close it, or choose 10–120 cm in 5 cm steps. Closing one side gives single-sided ventilation; opening both allows cross ventilation. Radiator position is independent. Equal opening heights give two windows twice the total opening area of one. Wind direction is measured horizontally in plan view: 0° from left, 90° parallel to both walls, 180° from right. The vertical slice receives an idealized pressure difference Δp = ½ρUn|Un|, where Un = U cos θ; half is applied to each exterior reservoir with opposite signs. Flow through the openings is solved, not prescribed.
Fresh-air fraction is a passive tracer: 0% initially indoors, 100% outdoors and at reservoir inflow. It is transported and diffused with the simulated flow, independently of heat. “Below 10% fresh” measures the area still poorly reached by outdoor-origin air. It is not an indoor air-quality or safety score.
Numerical model
WebGPU, with Rust/WASM as a fallback, solves incompressible Boussinesq airflow and heat transport on a 5 cm grid. Pressure projection enforces volume conservation; buoyancy drives motion. Heat is advected and diffused, with radiator heat flux integrated into the temperature equation. ν = 1.5 × 10⁻⁵ m²/s, α = 2.1 × 10⁻⁵ m²/s, ρcp = 1206 J/(m³·K).
Both simulations use identical adaptive time steps, independent of rendering. Playback changes only how quickly those steps are computed. One room displays Room A; Room B continues in the background so returning to comparison keeps both rooms synchronized. The chart averages indoor air cells, excluding solid radiators.
Limits
Educational simulation, not an engineering prediction. The 2D geometry, coarse grid, prescribed surface pressures and heat-transfer coefficient limit realism. This model does not resolve outdoor wakes, gusts, or wind-driven turbulence at a single opening. Parallel wind produces no imposed pressure difference; in a real building it can still cause ventilation. Steady single-sided wind exchange is therefore underestimated. Numerical diffusion adds mixing; small jets and turbulence are unresolved. The minimum open gap is 10 cm (two grid cells), so its exchange rate is especially approximate. Tilted panes are stair-stepped on the 5 cm grid with a one-cell thickness; their top gap and hinge angle are coarse approximations. Side-gap flow around a real tilted window is not represented. Large temperature differences weaken the Boussinesq approximation, especially near 90 °C radiator surfaces. Wind speeds up to 10 m/s are idealized steady pressure forcing; real exterior wakes and gusts are not resolved.
Convective heat-flux boundary condition ↗ · Wind-pressure formulation ↗
Live edits keep simulation time and existing air fields. Opening a window or moving a radiator fills newly exposed cells from nearby air, then corrects airflow for the new boundaries. The change is instantaneous: sash motion, displaced air, and radiator thermal mass are not modeled. Undo changes the controls back; it does not rewind the air.