Room airflow

Solver: starting…

WebGPU starts automatically when available. WASM takes over if GPU initialization or a numerical check fails, or the GPU becomes unavailable. You can also select WASM manually. Changing engine starts a new run.

Compare speed & accuracy ↗
SIMULATION TIME00:00.0
Measuring…
Applied
Setup options

Both rooms + shared settings

Saved in this browser. Reload starts a new run.

ConditionsEdit

Starting temperatures

Restart required

Changes start a new run from 00:00.

21 °C
10 °C25 °C

−5 °C
−15 °C10 °C

Outdoor wind

Changes apply live

Wind creates a pressure difference between the window walls.

2 m/s
Off10 m/s

Direction relative to the room
Fine-tune angle 0° · from left
0°
0° · left90° · along walls180° · right

Angle viewed from above. 90° travels into or out of this cutaway, not up or down.

Model response

How does this relate to the airflow arrows?

Wind speed is an outdoor setting. The model turns it into pressure at the window walls, then calculates air movement through the openings. The arrows show that movement, including circulation from temperature differences and fans. Changing the wind preserves existing air motion; it does not stop or redirect every arrow instantly.

The exterior strips are simplified air reservoirs near the walls, not a simulation of the surrounding weather. Along-wall wind would need a third dimension; its ventilation effect is omitted here.

Shared by both rooms. Radiator temperatures are set on each radiator.

This setting differs between Room A and Room B. Saved selection. The simulation still uses the applied value.
Same average temperature to 0.1 °C.

Room A

Average indoor air21.0 °C
Since start0.0 °C
Fresh air0.0%
Below 10% fresh100%
Heat to air0 W
Since reset0.00 Wh
per 1 m depth
Click an object to edit · Drag window edges or the fanChanges apply live

Room B

Average indoor air21.0 °C
Since start0.0 °C
Fresh air0.0%
Below 10% fresh100%
Heat to air0 W
Since reset0.00 Wh
per 1 m depth
Click an object to edit · Drag window edges or the fanChanges apply live
OUTDOOR-ORIGIN AIR
−15015304590 °C
Same fixed scale
Loading solver…

Arrows show computed local air movement. The arrow-length legend is a scale reference shared by the visible rooms, not a wind reading. Hover over air for its local speed.

Average indoor temperature

Room ARoom B%

Chart only · shared axes for both rooms. Thermal colors stay fixed.

Same average temperature to 0.1 °C.

Model assumptions

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.