WindCanvas.html in a browser, start WindCanvas from the Start menu or the desktop shortcut instead. File → Open… (Ctrl+O) opens projects, pictures, PDFs, SVG/DXF drawings and 3D models; projects save as .windcanvas files (older .aerolab files open too) (Ctrl+S), and double-clicking one in Explorer opens it in WindCanvas. Drag and drop onto the window works as described below.WindCanvas — User Guide
This guide covers WindCanvas 1.0, the single-file browser wind tunnel WindCanvas.html. Sections 1–9 need no fluid
dynamics. Sections 10 and 13 give engineers the exact definitions, settings, limits and validation data.
Contents
- What WindCanvas is
- Quick start in five minutes
- The screen
- Building shapes
- Presets
- Importing pictures, drawings and models
- The tunnel and the flow
- Smoke and visualisation
- 3D mode
- Reading the results
- Reports, export and printing
- Projects, autosave, appearance and shortcuts
- Physics and accuracy
- Troubleshooting
- Glossary
On a Mac, use
Cmdwherever this guide saysCtrl.
1. What WindCanvas is
WindCanvas is a wind tunnel that runs in your web browser. Put a shape in the tunnel — a preset car, wing or hull, something you draw, a photo, a PDF or a 3D model — and WindCanvas computes the flow around it, live, on your graphics card. You see the air as smoke and colours, and you get the numbers an engineer asks for: drag and lift coefficients, pressures, separation, the wake and the shedding frequency, each with an honest score of how far to trust it. Every change — a slider, a brush stroke, a rotated wing — takes effect in the running flow within a frame. The solver is a GPU lattice-Boltzmann method (D2Q9 in 2D, D3Q19 in 3D) with a Smagorinsky large-eddy subgrid model.
WindCanvas was called AeroLab before version 1.3. Projects saved by AeroLab (.aerolab and .aerolab.json files) open
as they are, and the desktop app brings its settings, recent projects and autosave across the first time it starts.
What you need
- A current desktop browser with WebGL2 and hardware acceleration: Chrome or Edge 90+, Firefox 90+ or Safari 15+. A recent laptop GPU runs the 2D tunnel at the default resolution; a discrete GPU is recommended for the Ultra resolutions and for 3D at High or Ultra.
- A screen at least 1024 px wide (below 1100 px the side panel becomes a drawer). Touch works: pinch to zoom, two-finger drag to pan.
- Nothing else. Double-click
WindCanvas.html: no install, no server, no internet. Your files are read locally and nothing is uploaded. The one exception is activating a licence key, which sends only the key and a device name (section 12, Licence).
Without WebGL2, WindCanvas still opens for drawing, importing, presets, the instant airfoil analysis, saving and reports (section 14).
2. Quick start in five minutes
- Open WindCanvas. Start WindCanvas from the Start menu or desktop if you installed the desktop app, or
double-click
WindCanvas.htmlto run the single-file version in your browser. After "Compiling shaders…" a sedan appears in a running tunnel: Beginner mode, air at 20 m/s, a moving road, smoke on and colours showing speed. Its wheels are drawn but not simulated, so air can flow under the car (section 5 explains why), and it rides at 0.30 m — higher than the sedan preset's real 0.14 m — so the underbody gap spans about six cells of the default grid (in its 25 × 12 m tunnel) instead of three. A 3-cell gap chokes: the moving road pumps air into it and the lift comes out several times too high (in a ride-height sweep in that tunnel Cl fell from 3.8 at 0.14 m to about 1 at 0.30 m; the first-run scene settles near Cd 0.95, Cl 1.0). The Underbody gap under-resolved advice still appears, because about eight cells are needed for lift that no longer depends on the grid. On the very first run a Welcome window offers Try a preset, Drop a picture or PDF, Draw with the brush, Take the 2-minute tour and Skip. - Pause and play with
Spaceor the play button. The smoke stops; drawing still works. - Change the wind speed. In the Tunnel tab, drag Wind speed. The smoke speeds up at once — there is no Apply button. The selector beside the slider changes the unit.
- Draw. Press
Band paint a bump on the car's roof. Behind it the flow lets go of the surface: that is separation, the main source of drag.[and]resize the brush,Eerases,Ctrl+Zundoes. - Read the numbers. The status bar shows Drag, Lift, Wind and a fidelity word (excellent, good, fair or rough). The Explain tab describes the flow in plain English; linked words open the glossary.
- Load a preset. In Presets, click the Aircraft chip, then NACA 2412. It replaces the car (Undo brings
it back) and sets a sensible speed and fluid. Press
V, click the wing, open Object and drag the Angle of attack dial: lift rises by about 0.1 per degree until the wing stalls. - Make a report. Click Make report in the top bar for a printable page with the set-up, the numbers, charts, pictures and assumptions. Print it or save it as PDF.
Help → Take the 2-minute tour walks through the same loop and waits for you at each step.
3. The screen
┌ Top bar: name · mode · 2D/3D/Split · playback · undo/redo · clear · Make report · print · search · theme · help ┐
├ Tool rail ┬────────────── Viewport: tunnel, smoke, HUD, legend ──────────────┬ Inspector (tabs) ┤
├ Status bar: drag · lift · wind · time · fidelity · saved ────────────────────────────────────────┤
└ Chart strip: Cd / Cl history · Cp distribution · spectrum ───────────────────────────────────────┘
Top bar
| Control | Use |
|---|---|
| Project name | Click to rename. A dot beside it means unsaved changes; an amber dot means autosave is unavailable. |
| Beginner / Enthusiast / Engineer | The mode switch (below). |
| 2D / 3D / Split | The 2D tunnel, the 3D tunnel, or the 2D editor beside the 3D view. |
| Play / Pause, Step once, Reset flow, Reseed smoke | Space; Step once (.) pauses and advances the flow by one animation frame's worth of solver steps at the current playback rate — Shift+N, or Shift+click on the button, advances exactly one lattice step; restart the flow, keeping shapes and settings (Shift+R); re-emit all smoke. |
| Playback rate | Auto, or a maximum from 0.1× slow to 200 /frame. The readout beside it ("×0.06 real time") is simulated seconds per real second. |
| Power | How much of the computer the simulation may use: Battery saver, Balanced (default), Maximum or Custom — see Playback. |
| Undo / Redo | Ctrl+Z / Ctrl+Y. The tooltip names the step; the badge counts the steps. |
| Clear, Make report, Print | Clear menu (Ctrl+Shift+C), report (Ctrl+Shift+R), print (Ctrl+P). |
| Search | The command palette (Ctrl+K): find any control, tool, preset, theme, colormap or glossary term — even ones the current mode hides. |
| Theme, Help | Seven colour themes. Help holds the Glossary (F1), the tour, Keyboard shortcuts (?), Physics & accuracy, Welcome and About WindCanvas. |
Tool rail (left): the tools of section 4, with text labels in Beginner mode, plus Zoom in, Zoom out and
Fit view (F). Right-click Brush or Erase for a size slider.
Viewport. The flow enters on the left, so bodies should face left. Zoom with the wheel or a pinch. Pan with the middle
or right mouse button, two fingers, the Pan tool, or by holding H; Space never pans. The HUD (top right) shows the
frame rate, steps per frame taken / maximum ("GPU-limited" when the graphics card is the limit), simulated time,
real-time factor, the Reynolds number with the effectively simulated value, Mach, Cd, Cl and the fidelity grade. The
colour legend is bottom left, a hint for the current tool bottom centre, and the speed, pressure and Cp under the cursor
bottom right. In Enthusiast and Engineer modes the last stretch of the tunnel is shaded and labelled absorbing
outlet — the solver damps the flow there, so readings inside it are not real (section 8).
Inspector (right). Tab hides or shows it. Each tab's ? opens the glossary terms for that tab, and
double-clicking a slider's label resets it to its default.
| Tab | Contents |
|---|---|
| Explain | "What am I seeing?": the flow in three to six sentences, plus the top Suggestions in Beginner mode. In Engineer mode it becomes a card at the top of Analysis. |
| Tunnel | Size, moving ground, blockage and grid, wind speed, fluid, volume flow, resolution, walls |
| Flow | Wind, fluid properties, Reynolds mode, inlet and outlet, numerics |
| Smoke | Smoke streams and emitters |
| View | Fields, colormaps, overlays, markers, styles, 3D view |
| Object | The selected shape and the list of shapes |
| Analysis | Coefficients, forces, Cp, wake, Strouhal, fidelity, advice, probes, snapshots, sweeps, validation |
| Report | Report builder and data export (Enthusiast and Engineer) |
| Presets, Import, Project | The preset library; file import; saving, autosave and appearance |
Status bar. Beginner mode shows Drag, Lift, Wind, simulated time, the fidelity word and Saved / Unsaved. Enthusiast adds L/D, Re, q, fps, steps and grid; Engineer adds Mach, steps/s and ms/step. Click the fidelity item to open Analysis, or Unsaved to save. Long tasks show a progress bar here with a cancel button.
Chart strip. Live Cd / Cl history, Cp distribution and Spectrum of Cl with the shedding peak. Click the Charts header to open or close it; it starts collapsed in Beginner mode.
The three modes
Modes change only how much you see — never the solver, the project or the results, and switching never restarts the flow.
| Beginner | Enthusiast | Engineer | |
|---|---|---|---|
| Tools | Select, Brush, Erase, Polygon, Rect, Ellipse, Airfoil, Probe, Smoke | All 14 | All 14 |
| Tunnel and Flow | Size, moving ground, speed, fluid, temperature, volume flow | + resolution, walls, Reynolds mode, altitude, humidity | + custom grid, inlet, outlet, numerics |
| Smoke | Stream controls, visual speed multiplier | + trail length, particle life, emitters | + particle budget (no visual multiplier) |
| View | Field, colormap, legend, theme, texture | + range, overlays, markers, body and wall styles | Same |
| Object | Name, angle, position, size, mirror, mounting, visual only, colour | + scale x / y, reference, outline, style, shape parameters | + area, span, Boolean, 3D, preset parameters |
| Analysis | Results in words, flow numbers, fidelity, advice | + Cm, forces, Cp, wake, Compare | + convergence, per-shape forces, Strouhal, probes, sweeps, validation |
| Report tab, chart strip | No tab; strip collapsed | Yes; open | Yes; open |
Nothing is out of reach: Show advanced controls… at the end of a tab reveals its hidden groups in place, Ctrl+K
finds any control, and every shortcut works in every mode. The mode is a preference kept in your browser, not part of the
project.
Phones and tablets
The browser version runs in Safari on iPhone and iPad and in Chrome on Android phones and tablets.
- Gestures. One finger draws, selects and drags with the current tool; two fingers pinch to zoom and drag to pan the 2D tunnel. In 3D, one finger orbits and two fingers zoom and pan.
- Phones. The top bar keeps 2D / 3D, play, reset, undo and the plan badge; the More button (three dots) holds the mode, Power, Make report, Clear, Theme, Help and Licence. The tab at the right edge opens the settings drawer. Turn the phone sideways for the biggest tunnel.
- Battery. On its first run on a phone, WindCanvas starts in Battery saver (Power in the More menu), which keeps the phone cool; tablets start in Balanced. The simulation pauses whenever the app is in the background.
- Like an app. On windcanvas.com/app, choose Add to Home Screen (Safari: Share → Add to Home Screen; Chrome: ⋮ → Add to Home screen or Install app). The icon opens WindCanvas full screen, and it opens even without a connection once it has been loaded online.
4. Building shapes
Every tool works while the flow runs. Each gesture is one undo step, and nothing you draw resets the flow.
| Tool | Key | How to use it |
|---|---|---|
| Select | V | Click to select, Shift+click to add, drag on empty space to box-select. Drag to move; handles scale and rotate. |
| Pan * | H | Drag the view. Tap H to switch to Pan; hold H to pan briefly from any tool — even halfway through a polygon or spline, whose points stay put. |
| Brush | B | Paint solid material. A stroke that starts on a brush shape extends it. |
| Erase | E | Carve material out of any body. |
| Polygon | P | Click corners. Backspace removes the last; Enter or a click on the first point closes; Esc cancels. |
| Rect, Ellipse | R, O | Drag. Shift gives a square or circle; Alt draws from the centre. |
| Spline * | S | Click points for a smooth curve. Enter closes it; Shift+Enter leaves it open as a thin plate. |
| Airfoil | A | Drag from leading edge to trailing edge, then set the NACA code, chord and angle in the pop-up. |
| Plate * | L | Drag a thin flat plate. Shift snaps the angle to 15° steps. |
| Text *, Measure * | T, M | Notes that never affect the flow; length, Δx, Δy and angle, with Shift to pin the dimension. |
| Probe | Q | Hover for a readout; click to pin a probe. |
| Smoke wand | K | Click for a point emitter, drag for a line, Shift+click a body for a surface emitter. |
* On the rail in Enthusiast and Engineer; the keys work in every mode.
Brush and eraser. The cursor shows the diameter in metres and cells, for example "⌀ 0.24 m · 10 cells". Change it with
[ and ], Alt+wheel or the size slider (1–25 % of the tunnel height). Keep strokes at least three cells thick:
thinner ones leak and, at speed, can trigger a flow reset. Eraser strokes all live in one shape, Carve (eraser
strokes); delete it and everything erased comes back.
Transforming. A selected shape has eight scale handles and a rotation handle. Shift snaps rotation to 1° and scale
to 5 %; Alt scales about the centre; arrow keys nudge by one cell (ten with Shift). A mini toolbar offers Mirror
horizontally, Mirror vertically, Duplicate, Lock / unlock, Mount on ground and Delete. Alt+click selects one member of a
group. Esc cancels a gesture, then clears the selection.
The Object tab edits the selected shape with numbers:
| Group | Controls |
|---|---|
| Shape | Name; Angle of attack dial (nose-up positive, ±45°, Shift snaps to 1°, double-click resets; use the rotation handle for larger angles); Position x / y; Size × (Beginner) or Scale x / y; Mirror x / y; Mount on ground with Ground gap; Visual only (not simulated); Colour |
| Body & reference * | Visible, Locked, Reference body (Re, Cd, Cl), Reference length, Reference height, Category; Engineer adds Reference area and Span. Empty means automatic. |
| Outline * | Make hollow (with Wall thickness) for ducts and shells; Smooth outline (with Smoothing passes) for traced edges |
| Style * | Outline colour, Texture, Opacity — looks only |
| Parameters * | Rectangle: width, height, corner radius. Ellipse: radii, segments. Plate: length, thickness, rounded ends. Airfoil: NACA code (4 or 5 digits), chord, thickness ×, closed trailing edge. Spline: tension, closed curve. |
| Boolean & 3D (Engineer) | Boolean: Add or Subtract; 3D depth; 3D body from profile: Extrude, Revolve or None (2D only); z offset |
| Preset parameters (Engineer) | Live sliders that regenerate a preset body while the flow runs |
* Enthusiast and Engineer.
Below sits the Shapes list, with hide, lock and delete buttons per shape; drag to reorder. The reference body (badge REF) sets the Reynolds number and normalises Cd and Cl. If you choose none, the largest body is used.
Visual-only parts. Tick Visual only (not simulated) to keep a shape in the picture but out of the simulation: the air flows through it as if it were not there. It is drawn see-through with a light hatch and a dash-dot outline (simulated bodies are solid), the Shapes list adds "(visual only)", it can never be the reference body (that switch is greyed out), it gets no force readout, it does not count towards blockage, and it is left out of the 3D tunnel. Everything else — selecting, moving, rotating, scaling, undo, saving — works as for any shape. The classic use is a car's wheels in 2D (see Presets); untick it to make a part solid again (one undo step).
Add and subtract. A Subtract shape carves fluid out of the add shapes listed above it — holes, ducts, inlets — so the order matters.
Editing. Undo with Ctrl+Z and redo with Ctrl+Y (practically unlimited; undo never resets the flow). Pressing
undo in the middle of a drag, or between the clicks of a polygon, safely cancels that unfinished gesture instead; press
it again to undo the previous change. Ctrl+D
duplicates, Ctrl+G groups (members move together but keep their own forces; groups cannot nest), Ctrl+L locks,
Ctrl+A selects all and Del deletes. Align lines up several shapes by their edges or centres, or puts one shape
Centre in tunnel (30 % along) or Mount on ground.
Snap to grid (View → Overlays, Enthusiast and Engineer) rounds the points you place with Polygon, Spline, Rect,
Ellipse, Airfoil, Plate, Text, Measure, Probe and the smoke wand, and the position of a shape you drag, to the Snap
step (0.1 m by default; any value from 1 mm to 100 m). A small crosshair shows the next snap point. Holding Ctrl
inverts it for one gesture — snap once while it is off, or place freely while it is on. Brush, eraser, rotating and
scaling are never snapped. Choose a step a few times the cell size so snapped edges also fall cleanly on the grid.
Clear menu (Ctrl+Shift+C): Clear smoke trails, Reseed smoke, Clear probes, Clear emitters, Clear annotations, Clear
shapes and Clear everything (tunnel, fluid and settings are kept). Every item except clearing trails can be undone.
Beginner mode asks before clearing more than five shapes.
5. Presets
The Presets tab holds 84 ready-made bodies. Each has a realistic size, a tunnel sized for it, a recommended speed and fluid, and published reference values where they exist.
| Category | Examples | Set-up |
|---|---|---|
| Fundamentals (16) | Circular and square cylinders, flat plates ⊥ and ∥, ellipse, wedge, teardrop, sphere, cone, tandem cylinders, backward-facing step, venturi, diffuser, orifice | Air, 10 m/s |
| Automotive (16) | Sedan, hatchback, coupé, SUV, pickup, van, sports car, supercar, Formula 1, LMP prototype, truck + trailer, bus, motorcycle, Ahmed body, Kamm tail, roof deflector | Air, 25–55 m/s, moving ground |
| Aircraft (20) | Any NACA 4-digit code; NACA 0012, 2412, 4412, 6412, 0015, 0018, 23012; Clark Y; plates; flap, slat and three-element wings; fuselage, fighter, glider; propeller section; rocket; capsule | Air, 30–50 m/s |
| Marine (11) | Displacement and planing hulls, keel, sail, hydrofoil, submarine, catamaran, kayak, bulbous bow, propeller section, rudder | Seawater, 4–12 m/s (kayak: fresh water; sail: air) |
| Sports (7) | Golf ball, football, cyclist, ski jumper, javelin, discus, aero helmet | Air, 13–70 m/s |
| Wind engineering (8) | Building, tall tower, bridge deck, gable roof, dome, turbine blade, solar panels, chimney | Air, 20–60 m/s, atmospheric boundary layer |
| Validation (6) | Cylinder Re = 100, Poiseuille channel, flat plate Re = 400, NACA 0012 at 4°, Ahmed body (3D), sphere Re = 100 (3D) | Own tunnel and numerics |
Search by name or tag, or click a category chip. Cards show the literature Cd and a 3D badge on presets that have a 3D form.
- Replace removes the tunnel's shapes, emitters and probes first; Add keeps them, and the existing reference body
stays the reference. Clicking a card replaces in Beginner mode; in the other modes it adds when the tunnel already has a
reference body.
Shift+clickdoes the opposite. Loading is one undo step. - Recommended settings — tunnel size, walls, moving ground, speed, fluid and default numerics, but not the resolution — are always applied in Beginner and Enthusiast. Engineer mode has the switch Also apply recommended settings.
- The sliders button on a card opens Parameters (for example the Ahmed body's slant 0–40°, or a car's ride height and Wheels) with Replace scene, Add to tunnel and Close. Engineer mode shows them live in Object → Preset parameters.
Wheels. Every road vehicle has a Wheels parameter with three choices:
| Wheels | What you see | What the solver sees |
|---|---|---|
| Visual only (default) | Tyres, rims and hubs, drawn see-through as a separate "Wheels" part grouped with the body | A smooth underbody with its real ground clearance — air flows under the car |
| Solid | The wheels as part of the body outline | The wheels as solid: in 2D they close the gap under the car |
| Hidden | No wheels | A smooth underbody, as with Visual only |
The honest reason for the default: a 2D tunnel is a slice through an infinitely wide car, so solid wheels in a side view form two walls that seal the underbody — the gap a real car keeps open between its wheels. The air trapped over the moving road then distorts lift and drag (a test sedan with solid wheels read a lift coefficient of about +3, where a real car makes little lift). Visual-only wheels look right and leave the gap open; switch to Solid to see the difference, and keep in mind that neither choice models what real wheels do to the flow. In 3D, cars with a 3D form are built with real wheels whatever this setting says (section 9). The F1 car has the same choice; the motorcycle's wheels are always solid.
Marine presets are fully submerged: there is no water surface. Validation cards have a Run button (see Compare, sweeps and validation).
6. Importing pictures, drawings and models
Drop files anywhere on the window, click Import → Drop files here or click to browse, or paste with Ctrl+V
(images, SVG or DXF text, project or geometry JSON). Files are read locally. A link dragged from a web page is not a file:
save the picture first.
| File | Result | Limit |
|---|---|---|
| PNG, JPG, WebP, GIF, BMP | Traced outline | 80 MB, 100 megapixels |
| One page, as vectors or traced | 200 MB | |
| SVG, ASCII DXF | Exact outlines | 50 MB, 100 MB |
| STL, OBJ, PLY, glTF / GLB | 3D body; its silhouette in 2D | 500 MB, 3 million triangles |
.windcanvas, .windcanvas.json (and older .aerolab, .aerolab.json) | Opens the project | 100 MB |
| Geometry JSON, GeoJSON | Polygons in metres | — |
Each import opens a dialog with a live preview. Nothing changes until Add to tunnel (Enter), and Cancel (Esc)
leaves the project untouched. A successful import is one undo step; problems show inside the dialog without closing it.
Long stages (reading a big model, rendering a PDF page) show progress in the status bar; its cancel button stops the
import quietly. Opening a project file while the current one has unsaved changes asks first. Replace current
reference body also removes the old body's visual-only parts, such as a preset car's wheels.
HEIC, TIFF and AVIF pictures work only where the browser can decode them — otherwise export JPEG or PNG first.
Photos
In Auto mode WindCanvas picks Photo, Sketch or Cut-out (a PNG with transparency). For a photo it samples the background around the border, floods inwards until it meets the body's sharp edges, refines the boundary by colour, fills windows, keeps the largest part and traces a smooth outline with corners preserved. Small subjects are re-traced from a full-resolution crop.
The dialog shows the Original, the Extracted result and a Grid preview of what the solver will see. The toolbar has Keep and Erase brushes, Crop, Ground line, Flip H, Flip V, Rotate 90° and Reset. A guess such as "Looks like a car · closest preset: Hatchback — check the length" comes with Use my outline, Use the … preset instead and Flip to face the wind. The guess compares proportions with the presets; it is not object recognition.
| Setting | Default | Effect |
|---|---|---|
| Mode | Auto | Auto, Photo, Sketch or Cut-out |
| Tolerance (Photo) | 12 % | Higher removes more background; lower keeps more body |
| Remove shadow (Photo) | Auto | Removes the floor shadow under cars |
| Ink threshold, Gap closing, Ignore coloured lines (Sketch) | 20, automatic, off | See Sketches and scans |
| Invert, Close radius, Fill holes | Off, 2 px, on | Swap body and background; close notches; windows are not holes |
| Keep all parts | Off | Imports every separate part as its own shape |
| Detail (ε), Smoothing | 1.5 px, 1 | Simplification; corner-preserving smoothing |
| Real length, Mount on ground with Gap | From the guess | Size along the flow and floor mounting |
| Name | File name | The new shape's name |
| Replace current reference body | On if one exists | Swaps the body forces are reported for, in the same undo step |
| Apply recommended tunnel & flow | On in Beginner | Speed, fluid and a tunnel sized for the body (below) |
Fixing a bad trace. Body missing: raise Tolerance or paint it with Keep. Background included: lower Tolerance or paint it with Erase. Shadow under a car: drag the Ground line to the tyres — everything below it goes. Subject touching the edge: Crop loosely. Facing right: Flip to face the wind. Jagged edges: more Smoothing. The grid preview warns when a feature is thinner than one cell.
Sketches and scans
Sketch mode uses an adaptive threshold, so uneven lighting is fine. It removes page frames and specks and bridges gaps up to twice the Gap closing size. If the outline is still open, the dialog says so, and a second Add to tunnel imports it anyway. Draw one dark, continuous line, photograph the page flat, and tick Ignore coloured lines on squared paper. A ground line drawn under the sketch is removed and ticks Mount on ground; title blocks and paragraphs of text are ignored.
PDF drawings
Choose a page shows thumbnails with the paper size and Vector drawing or Scanned page badges. Under Use as pick Use vector geometry — exact outlines from CAD or Illustrator, the default for vector pages; enter the real length, because the drawing scale is unknown — or Rasterise (trace the picture), with a Raster size of up to 4096 px. Scanned pages go straight to Sketch mode. If the vector paths cannot be read, the page is traced instead.
SVG and DXF
Vector files give exact outlines. Open line fragments are joined into loops (Join gaps); whatever stays open is reported and can become thin plates (Treat strokes as solids). The dialog also offers Layers (frozen DXF layers start off), Shapes (one, or one per layer), Keep small details, Fill holes, Drawing units (from the file, or 1 unit = 1 mm … 1 px, shown as "1 unit = 1 mm → body 4.52 m"), Real length, Flip, Name, What is it?, floor placement, reference replacement and the recommended set-up. DXF must be ASCII, and DXF 3D solids are not supported.
3D models
Import 3D model shows an orbiting preview and three silhouettes. Set the Up axis (CAD cars are often +Z), and use
Rotate 90° or Flip nose so the nose points left. Choose Units (the likely one is marked "guess") or type the
Real length. Then set Looks like, Mount on ground and the recommended set-up; the 2D Silhouette (Side,
Top or Front); and, for multi-part files, Merge or Separate (up to 16 shapes with their own forces). The
2D tunnel uses the silhouette; 3D voxelises the model itself, holes and overlaps included. For a .gltf, drop its .bin
and textures with it, or use .glb; Draco and Meshopt compression are not supported. Large models may not survive the
autosave, so save the project. After Add to tunnel the silhouette is traced in the background — a spinner shows
while it works, even for multi-million-triangle models, and Esc still cancels.
Real size and recommended set-up
The real length decides the Reynolds number, the blockage and the number of cells across the body, so check it. Apply recommended tunnel & flow (in the photo, drawing and 3D-model dialogs alike) uses air at 30 m/s with moving ground for cars, air at 50 m/s for aircraft and airfoils, water at 5 m/s for boats and air at 20 m/s otherwise, and sizes the tunnel the way the preset library does: the body's frontal height is at most 13 % of the tunnel height (for a car, measured from the floor), the tunnel is at least four body lengths and twice its height long, and free-flying bodies get a minimum height — six chords for an airfoil, 2.5 body lengths for an aircraft, 1.5 for a boat. It shrinks a tunnel that is too big as well as enlarging one that is too small, because an oversized tunnel leaves the body only a few cells across its height: a 4.5 m car gets 30 × 15 m, a 1 m airfoil 12 × 6 m. For best results use side-on photos with a plain background, shot from a distance with zoom; crop loosely; and make sure nothing in the grid preview is thinner than three cells.
Geometry JSON: { "type": "windcanvas-geometry", "units": "m", "rings": [[[x, y], …]] } (units m, mm, cm or in; the older type name "aerolab-geometry" also works), or
GeoJSON Polygon / MultiPolygon, with y up. Rings after the first are holes.
7. The tunnel and the flow
| Control | Range | Default | Notes |
|---|---|---|---|
| Length | 0.2–1000 m | 12 m | Height and width follow it unless pinned with their lock buttons. |
| Height | 0.05–2 × length | 6 m | |
| Width | 0.05–2 × length | 6 m | In 2D this is the span, used for the volume flow and for forces in newtons. |
| Moving ground (rolling road) | on / off | off | The floor moves at wind speed, as a road does under a car. |
Readouts show the Blockage (good up to 5 %, biased high above 10 %) and the Grid ("512 × 256 · dx 23.4 mm"). Size and resolution changes apply when you release the slider, and the flow carries on, seeded onto the new grid.
Resolution (Enthusiast and Engineer) is the biggest lever on accuracy — and on speed.
| Preset | 2D grid | GPU memory | 3D grid | GPU memory |
|---|---|---|---|---|
| Auto (3D default) | — | — | sized to the body: ≈ 16 cells across it, ≤ 1.2 M cells | ≤ ≈ 290 MB |
| Low | 256 × 128 | ≈ 12 MB | 64 × 32 × 32 | ≈ 19 MB |
| Medium (2D default) | 512 × 256 | ≈ 25 MB | 96 × 48 × 48 | ≈ 53 MB |
| High | 1024 × 512 | ≈ 76 MB | 128 × 64 × 64 | ≈ 119 MB |
| Ultra | 2048 × 1024 | ≈ 280 MB | 192 × 96 × 96 | ≈ 412 MB |
Refine around body (2D, under Resolution) runs a patch at twice the resolution around the bodies and their near wake — about 0.6 body lengths ahead, 1.5 behind and 0.6 body heights above and below — coupled both ways to the main grid every step. The body gets twice the cells across (the fidelity grade counts them) for roughly 1.5–2.5 times the work of the plain grid, where doubling the whole grid would cost eight times. Forces come from the patch, the field you see is the main grid with the patch's flow written into it, and the grid readout shows the patch ("· 2× patch 310 × 49"). The patch follows the body when you move it — the solver restarts from the running flow — and it is skipped (with a note) when there is no body or the body reaches into the inlet zone or the absorbing outlet layer.
Grids are for a 12 × 6 × 6 m tunnel. Above 256 MB WindCanvas asks first; above 768 MB it refuses. Ultra is not offered in Beginner mode. Engineer Custom sets Cells along length in steps of 32 — up to 4096 in 2D and 256 in 3D, within 8 million (2D) or 2 million (3D) cells. Browsers that draw WebGL in software get Low only. In 3D, Auto picks the grid for the body in the (auto-sized) tunnel — the sedan gets 256 × 56 × 71 — and Cells across body shows the result; the 2D and 3D resolutions are remembered separately (section 9).
Walls (Enthusiast and Engineer): the Ceiling, Floor and, in 3D, Side walls can be Free-slip (frictionless, the default), No-slip (a real wall with its own boundary layer) or Periodic (set on both opposite walls). The floor can also be a Moving belt; the Moving ground switch overrides the floor setting.
Wind speed runs from 0.1 to 150 m/s for gases and 0.01 to 30 m/s for liquids, in m/s, km/h, mph, knots or ft/s. Volume flow Q = speed × height × width (m³/s, L/s or CFM); typing a value of Q sets the speed.
| Fluid | Adjustable (default) | ρ and μ at the defaults |
|---|---|---|
| Air (ISA) | Temperature (15 °C) — the sea-level temperature of the day, Altitude (0 m), Relative humidity (0 %) | 1.225 kg/m³, 1.79×10⁻⁵ Pa·s |
| Water (fresh) | Temperature, 4–40 °C (20 °C) | 998 kg/m³, 1.00×10⁻³ Pa·s |
| Seawater | Temperature (15 °C), Salinity (35 g/kg) | 1026 kg/m³, 1.22×10⁻³ Pa·s |
| Glycerine | Temperature (20 °C) | 1261 kg/m³, 1.41 Pa·s |
| Motor oil (SAE 30) | Temperature (40 °C) | 860 kg/m³, 0.086 Pa·s |
| Hydrogen, Carbon dioxide, Helium | Temperature (20 °C), Pressure (101.325 kPa) | Ideal gas: ρ = 0.084, 1.83, 0.166 kg/m³ |
| Custom | Density, Dynamic viscosity, Speed of sound | As entered |
The Flow tab lists the live properties: ρ, μ, ν, the speed of sound, the Reynolds number, the Mach number and the dynamic pressure q = ½ρU². The air temperature is the temperature at sea level on the day: at altitude the air follows the standard atmosphere shifted by the same amount, so with 15 °C every altitude gives the standard values.
The wind-speed number is kept in the unit you choose: switching from m/s to km/h turns 20 into 72 and keeps the physical speed. The limits always mean the same physical range — 0.1–150 m/s for gases is 0.36–540 km/h.
Reynolds and Mach numbers
The Reynolds number Re = U·L/ν compares inertia with viscous friction; it decides whether the flow is laminar or turbulent and where it separates. WindCanvas shows two values: the requested Re of your set-up, and the simulated Re that the grid can actually represent. For air at realistic speeds the second is far lower — about 6.7 million versus a few thousand for the first-run sedan. Bluff bodies tolerate this gap; airfoils do not (section 13).
Flow → Reynolds number (Enthusiast and Engineer) offers Physical (true Re) or Target Re (1 to 10⁸), which adjusts the viscosity to hit the number you type — ideal for textbook cases. The Mach number is speed ÷ speed of sound. Above 0.3 (about 100 m/s in air) compressibility matters, which the solver does not model, and a warning appears.
Inlet, outlet and numerics (Engineer)
Inlet & outlet: Profile is Uniform or a Power-law boundary layer, u = U·(y/δ)^(1/n), with Power-law 1/n (3–12, default 7) and BL height δ (1–50 % of the height, default 15 %); it needs a no-slip or moving floor. Turbulence intensity adds 0–20 % random fluctuation at the inlet. Outlet (Flow → Inlet & outlet) is Fixed pressure (ρ = 1), the default, or Convective outflow; the change applies at once without restarting the flow, and is saved with the project. Either way the last 8 % of the tunnel is an absorbing layer that soaks up pressure waves and vortices before they reach the outlet, so the choice rarely matters for results upstream of it (the absorbing outlet layer).
| Numerics | Range | Default |
|---|---|---|
| u_lat target, u_lat max | 0.005–0.1, 0.02–0.17 | 0.05, 0.1 |
| Collision | Cumulant, Recursive regularised, BGK, TRT (2D and 3D) | Cumulant |
| Walls | Curved (interpolated), Staircase (cell mask) — 2D and 3D | Curved |
| Refine around body | Off, 2× patch around the bodies — 2D (Tunnel → Resolution) | Off |
| Auto τ min (per collision model) | on / off | on |
| τ min (when Auto is off), τ max | 0.50001–1, 1–5 | 0.505, 2 |
| Smagorinsky C_s | 0–0.3 | 0.12 |
| Forces every, Readback every | 1–64 steps, 1–60 frames | 4, 8 |
| Start-up ramp, Velocity clamp | 0–100 000 steps, 0.1–0.5 | 0, 0.35 |
| GPU budget / frame | 1–30 ms | 10 (used by Power: Custom; moving it selects Custom) |
| Reference area | Auto (by category), Frontal, Planform, Custom | Auto |
The Lattice readout shows the values in use, for example "τ 0.50010 · τ_min 0.50010 (auto) · u_lat 0.100 · Ma_lat 0.173 · clamped"; "(raised after instability)" means the safety net lifted the floor for this run. Changing the collision model, the walls or the τ settings applies at once without restarting the flow. Section 13 explains each one.
Playback
One solver step covers a tiny slice of time — often well under a millisecond — so Auto playback runs as many steps per frame as the GPU sustains, up to 200, and backs off when frames slow down. The smoke moves at the simulated speed: at "×0.05 real time" it crawls even though the air is doing 20 m/s. Smoke speed × (visual) in the Smoke tab (Beginner and Enthusiast) speeds up only the smoke on screen; the HUD says so, and reports ignore it.
Power (top bar, every mode; details in Project tab > Performance) sets how much of the computer the solver may use. It changes only how fast the flow develops, never the results.
| Power | Solver GPU time per frame | Frame rate | Typical use |
|---|---|---|---|
| Battery saver | 4 ms | up to 30 fps | a laptop on battery: about a quarter of Balanced's solver work, cool and quiet |
| Balanced (default) | 10 ms | up to 60 fps | everyday use |
| Maximum | 16 ms | no cap | the fastest flow development (about 1.5× Balanced), at a lower frame rate and a warmer computer |
| Custom | your GPU budget / frame | your Frame-rate cap (0 = the display rate) | fine control |
Battery saver when unplugged (on by default) switches to Battery saver while a laptop runs on battery and says so; plugging in restores your choice, and a mode you pick while on battery stays until the next unplug (desktop app, Edge and Chrome — other browsers do not report the battery). Pause while the window is hidden (on by default) pauses the simulation while WindCanvas is minimised and carries on when it comes back; validation runs and sweeps are never paused. Moving GPU budget / frame (Flow tab > Numerics) switches Power to Custom. The setting belongs to this computer: it is remembered between sessions and is not saved in project files.
8. Smoke and visualisation
Smoke is a visual tracer carried by the computed flow; it never affects the solver.
| Control | Range | Default | Effect |
|---|---|---|---|
| Smoke on | — | On | Shows the smoke (5). |
| Stream count | 1–200 | 40 | Lines from the main injector. |
| Injection centre Y, X, Z (3D) | 0–100 % of height, 0–90 % of length, 0–100 % of width | 50 %, 2 %, 50 % | Where the injector sits. |
| Injection spread | 0–100 % of height | 90 % | Height of the band; 0 puts every stream on one line. In 3D, Engineer mode can set the band width separately. |
| Stream thickness | 0.5–8 px | 1.5 px | Scales with zoom. |
| Glow intensity | 0–1 | 0.6 | Brightness and bloom; not how long trails last. |
| Smoke volume flow | 0.1–10× | 1× | Emission rate; the readout shows particles per second (volume flow × streams × 120). |
| Smoke colour | Single colour, By speed, By vorticity, By pressure, Rainbow per stream | White | Swatches White, Warm, Cyan, Magenta, Lime and Theme accent, or a colour picker; the data modes use their own Colormap. |
| Particle style | Streaks, Dots, Ribbons | Streaks | Ribbons widen where the flow is fast. |
| Trail length * | 0–1 | 0.9 | How long trails persist, 0.15–4 s. |
| Particle life * | 0.2–10 flow-throughs | 1 | Above 1 keeps smoke visible in recirculating wakes. |
| Smoke speed × (visual) | 1–10 | 1 | Beginner and Enthusiast only. |
| Particle budget (Engineer) | 16 384–262 144 | 65 536 | Particles alive at once; the oldest are recycled. The top value is 2D only. |
* Enthusiast and Engineer. Reseed smoke restarts every particle; Clear trails wipes the trail image.
Emitters (Enthusiast and Engineer) add local smoke: a Point, a Line (like a smoke rake) or a Surface
emitter on a body outline, which lifts off exactly where the flow separates. Use the buttons or the smoke wand (K).
Each emitter has a name, position, length and angle (line), body and From / To span (surface), streams, rate and
an optional own colour; the eye button switches it off.
Field (View tab; keys 1–4 give None, Speed, Pressure, Vorticity): None (smoke only), Speed, Pressure
(gauge), Pressure coefficient Cp, Vorticity (shear layers and the vortex street), Density, Velocity x /
y (reversed flow, upwash), Turbulent viscosity (LES) (where the grid is too coarse) and Q-criterion (vortex
cores). Show field colours, Show smoke and Legend toggle the layers.
Colormaps: Turbo, Viridis, Inferno, Magma, Plasma, Jet, Cool–warm (diverging — best for signed fields such as vorticity and Cp), Grayscale, Blueprint, Rainbow, Custom, and Custom colormap…: a gradient of 2–5 stops with Start from current, Reverse, Apply and Save as…; saved maps stay with the project. Range (Enthusiast and Engineer) is automatic (2nd–98th percentile) or a fixed Minimum and Maximum, optionally on a Logarithmic scale.
Overlays (Enthusiast and Engineer): Streamlines (density 0.05–1), Velocity arrows (spacing 4–64 px),
Isobars (2–64 levels), LIC smear (a photographic smoke look), Grid (G), Snap to grid and Rulers &
dimensions. Markers: Separation points and Stagnation point (both on by default) and Wake outline.
Bodies & walls: body style (Solid, Outline, Hatched, Metallic, Cp-coloured outline), body colour, wall style (None,
Line, Hatched, Brick, Steel panel, Glass) and background.
Probes. With the Probe tool (Q), hover anywhere for a readout and click to pin a probe. In Engineer mode
Analysis → Probes lists them; tick record to log a probe for the Probes CSV.
The shaded band at the outlet. In the 2D view, in Enthusiast and Engineer modes, the last 8 % of the tunnel (41 of 512 columns at Medium) is shaded with a faint gradient and light diagonal hatching, a dashed line marks where it starts, and a small vertical label reads absorbing outlet. This is where the solver deliberately damps the flow so that pressure waves and vortices leave the tunnel instead of bouncing back off the outlet and shaking the whole flow. Inside the band the velocities and pressures are artificially smoothed: probes, streamlines and wake readings there are not real, and the hover readout adds "absorbing outlet (not physical)". Keep the body, its near wake and every probe upstream of the band — presets already put the body 30 % of the way along the tunnel; if a long wake reaches into the band, lengthen the tunnel behind the body. Beginner mode hides the shading, and the 3D view does not draw it, but the layer is always there in 2D and 3D (it is part of the solver, not a setting); the physics is in section 13.
Visual-only parts — such as the default wheels of preset cars — are drawn above the field and the smoke, see-through with a dash-dot outline, so they are easy to tell from simulated bodies.
9. 3D mode
The 2D tunnel is a slice through an infinitely wide body. The 3D tunnel computes the whole volume: coarser and heavier, but with flow round the sides, tip vortices and true wakes.
Click 3D in the top bar. Presets with a 3D form — the cards with a 3D badge: sedan, hatchback, coupé, SUV, van, sports car, supercar and bus, the Ahmed body, sphere, cone, teardrop, cylinders, the NACA wings, fuselage, rocket, capsule, displacement hull, keel, submarine, golf ball, football and the buildings — become true 3D models: a sphere is a sphere and a car stands on four real wheels. The model follows the 2D shape when you move, rotate or scale it. Other 2D shapes are extruded across the tunnel by their 3D depth, or revolved around their axis when set to Revolve; Engineer mode can change this per shape under Object → 3D body from profile (Extrude, Revolve or None — None keeps a shape out of the 3D tunnel). Extra parts of a preset, such as a wing's flap, are extruded. Visual-only parts never enter the 3D tunnel. Imported models are voxelised from the model itself. The tunnel Width becomes its real depth and the 3D resolution presets apply (section 7).
The 3D tunnel is sized for you. In 3D the walls matter through the body's frontal area, so the tunnel can be much smaller than in 2D — and every cell saved on empty air goes onto the body. With Tunnel → Auto-size tunnel for 3D on (the default), switching to 3D, or loading a preset in 3D, fits the tunnel around the 3D body: about one body length of air in front, two and a half behind, and a cross-section the body blocks by at most 8 %; the body moves to its new spot (cars stay on the floor). The default sedan goes from its 25 × 12 × 12 m 2D tunnel to 22 × 4.8 × 6.1 m. Your 2D tunnel is not lost: it is kept, body position included, and comes back when you switch back to 2D. Change the size yourself in 3D and auto-size turns off, so your size stays (and is kept for the next visit to 3D); turn it back on to re-fit. The 3D Resolution defaults to Auto, which aims for about 16 cells across the body's height while keeping the grid near a million cells — Cells across body under the grid readout shows what you get (17 high for the sedan, against 5 before). Expect about one simulation step per screen frame on a laptop GPU: the smoke moves slowly and a run needs a minute or two to settle, so let it run (or use a sweep, which steps faster in the background). Low/Medium/High/Ultra remain available when you want speed instead.
The 3D solver runs the same physics as 2D. Since 1.2.0 the cumulant collision model (the default) and the curved walls work in 3D too. The cumulant model keeps the 3D run stable down to the same lowest relaxation time as in 2D, so the default sedan's effective Reynolds number is about fifty times what the old 3D solver reached. The curved walls trace every lattice link into a body against the body's own triangles, so a 3D model keeps its true, smooth surface instead of voxel steps — on the sphere benchmark the drag error falls from about 8 % to 3 %. Engineer mode can still pick BGK, TRT or the recursive-regularised model (which needs τ ≥ 0.506 in 3D) and staircase walls.
Split shows the 2D editor beside the 3D view, and picking a drawing tool switches to it automatically. Eraser strokes
cut through the whole depth of an extruded body, and each brush shape is extruded by its own 3D depth. In the 3D view, drag to orbit, scroll to zoom and
right-drag to pan; Camera presets are Front, Side, Top, Iso and Rear, and in the 3D-only layout
F returns to Iso.
View → 3D view has up to six Slice planes (plane YZ, XZ or XY, position and field), 3D streamlines (10–500, as lines / ribbons or tubes), 3D smoke particles (about 10 000, up to 30 000, released on the inlet face), a Vortex isosurface of Q-criterion or vorticity (Enthusiast and Engineer; level as a percentage of the 99th percentile), Body colouring (Material or Cp), Tunnel box and Auto-rotate. Velocity arrows (View → Overlays) appear in 3D as arrow glyphs on the visible slice planes, and Wake outline (View → Markers) as a translucent cloud where the flow is slower than 90 % of the free stream.
- Seed streamlines chooses where the 3D streamlines start: Across the inlet spreads the seeds evenly over a plane at 10 % of the tunnel length (most lines pass the body by), Around the body keeps that plane but limits it to the body's frontal window plus 30 %, so every line wraps round the model and shows its tip and trailing vortices.
- Voxel preview (what the solver sees) (Enthusiast and Engineer) draws the solid cells of the 3D mask as a surface, even when a smooth model is shown. Use it when 3D forces look wrong: the solver knows only these voxels, so thin parts that fell through the grid or staircase surfaces show up here. Bodies without a display model always show the preview.
Both settings are saved with the project.
The 3D picture is fed by a copy of the field read back two or three times a second, so slices and surfaces update at that rate while the camera and smoke stay smooth — this is not lag.
How far to trust 3D numbers. The 3D force measurement itself is validated: a sphere at Re = 100 reads Cd 1.18 against the textbook 1.09 at only 16 cells across (the difference is the staircase surface and the tunnel walls, and it shrinks as the grid gets finer), a cylinder spanning the 3D tunnel gives exactly the 2D answer, and every run's forces agree with an independent momentum balance of its own flow to about 1 %. What limits a car is resolution: right-sized, a browser 3D grid still puts only about 16 cells across it, the boundary layer is a single cell thick, the flow separates too early and, before 1.2.0, the effective Reynolds number was a few thousand. With the 1.2.0 solver (cumulant, curved walls) the Reynolds number reaches about 1.7·10⁵ and the default sedan reads Cd ≈ 0.73 on a slip floor (0.77 with the old solver; staircase walls give 0.74 — at 17 cells across, the car's drag is set by its separated wake, not by its wall treatment) where a real one is ≈ 0.3 (about 2.5 times too high); with the old solver the number kept falling on finer grids (1.13 at 12 cells across, 0.89 at 17, 0.77 at 24 on the belt), and lift is too high (Cl ≈ 1) because the gap under the car is only one to three cells. The Ahmed body, the standard car-like reference shape, reads 0.98 when its preset is loaded in 3D (1.17 in its own, coarser validation tunnel) against 0.285 in the experiment. So use 3D to compare variants of the same body at the same resolution and to see the flow — differences of 10 % and more between variants are meaningful — not for absolute drag. (Until October 2026 the 3D sedan read Cd ≈ 3.9: three defects, now fixed, doubled and redoubled it — see section 13.)
Side force. In 3D the flow can push a body sideways, across the tunnel (+z). The Analysis tab then shows a
Cs card ("Side-force coefficient" in Beginner mode; Engineer mode adds its mean) and a Side force Fz row in
Forces, in newtons. A symmetric body set straight in the flow should read Cs ≈ 0 on average — a steady non-zero value
means it is yawed or off-centre (check z offset). Reports and CSV exports include Fz and Cs (cs in the History
CSV).
10. Reading the results
The numbers appear in the status bar, the HUD, the Explain tab (as sentences), the Analysis tab and the chart strip. They update a few times a second; read them once they have converged.
| Quantity | Definition | Typical values |
|---|---|---|
| Cd | Drag ÷ (½ρU² × reference area) | Airfoil below 0.05; car 0.25–0.35; sphere 0.47; cylinder ≈ 1.2; plate square to the wind ≈ 2 |
| Cl | Lift ÷ (½ρU² × reference area); negative is downforce | Wing: about 0.1 per degree, maximum 1.2–1.6 |
| Cm | Moment ÷ (½ρU² × area × reference length); nose-up positive, about the quarter chord (wings) or the centroid | ≈ 0 for a symmetric airfoil |
| L/D | Cl ÷ Cd | Glider 40–60; car with downforce 2–4 |
| Cd·A | Cd × reference area, in m²; independent of the area chosen | Car 0.6–0.8 m²; cyclist ≈ 0.3 m² |
Beginner mode also puts Cd into words, such as "like a modern sedan" or "like a circular cylinder".
Reference quantities. For automotive, marine, sports, wind and fundamental bodies the Reynolds length is the overall length (the diameter for a cylinder) and the reference area is frontal: frontal height × span in 2D, the body's projection in 3D. Aircraft and other lifting sections use the chord and the planform area (chord × span), with the moment about the quarter chord. Override them in Object → Body & reference or Numerics → Reference area. In 2D, forces in newtons are the force per metre multiplied by the span.
| Analysis group | Contents |
|---|---|
| Results | Cd, Cl, L/D and Cm *; in 3D also Cs (side force); a sentence in words; convergence (Engineer); fidelity |
| Inviscid (panel method, high-Re) | Lifting sections only (always listed in Engineer mode): panel-method Cl, Cm about the quarter chord and lift slope; a lattice-vs-inviscid table; why the two differ; Instant polar * — see Inviscid comparison |
| Forces * | Fx, Fy, Mz, Cd·A, reference area, per metre of span (2D) or the side force Fz (3D); Engineer: per shape, for up to eight tracked shapes |
| Flow numbers | Re requested and simulated, Mach, q, speed; Froude number (liquids); LES activity (Engineer) |
| Pressure distribution * | Cp curve, stagnation point, minimum Cp |
| Separation & wake * | Separation and reattachment points; wake length and width, recirculation length, boundary layer |
| Unsteadiness & Strouhal (Engineer) | Strouhal number, shedding frequency, confidence, Cl and Cd rms |
| Fidelity, Warnings, Recommendations | See below |
| Probes, Sweeps, Validation (Engineer); Compare snapshots * | See below |
* Enthusiast and Engineer.
Reading the Cp plot. Suction points up. Cp = 1 at the stagnation point and is negative where the flow speeds up — down to −3 or lower just behind a wing's leading edge. The area between the upper and lower curves is the lift; a flat, slightly negative stretch at the rear of a bluff body is separated flow. Separation is where the near-wall flow reverses; the wake is the region slower than 90 % of the free stream; recirculation is reversed flow on the centreline. The Strouhal number St = f·h ÷ U is about 0.2 for most bluff bodies (0.165 for a cylinder at Re = 100); a confidence below 60 % means there is no clear shedding peak yet.
Inviscid comparison (panel method)
A browser-sized lattice reaches an effective Reynolds number of only about 10⁴ (section 13). Bluff bodies hardly mind, but thin wing sections do: at that Reynolds number the boundary layer is laminar and separates early, so a NACA 0012 at 4° shows Cl ≈ 0.1 in the lattice where wind tunnels at engineering Reynolds numbers — and thin-airfoil theory — give about 0.44. To show both answers side by side, WindCanvas also solves the flow round the reference body with a vortex panel method: frictionless flow that stays attached, the high-Reynolds-number limit, computed in a few milliseconds.
- When it runs. Automatically when the reference body is a lifting section: an airfoil drawn with the Airfoil tool, a lifting preset (NACA sections, Clark Y, flat and cambered plates, propeller, keel, sail, hydrofoil, rudder and turbine blade sections), or any outline with a sharp (or thin, plate-like) trailing edge. Bluff bodies, cars, hulls, multi-element wings and sections facing backwards are left out. Engineers can set Panel method to Always on or Off in the block; the reason is shown when it is off. It is recomputed shortly after you move, reshape or rotate the body — never every frame — and it uses the body's current angle: positive rotation (nose up) raises the lift.
- The block. Analysis → Inviscid (panel method, high-Re) sits right below Results: the panel Cl, Cm (c/4) (nose-up positive) and the lift slope per degree beside thin-airfoil theory's 2π per radian (0.110 per degree) and the zero-lift angle. The table compares the lattice and panel values with the simulated Reynolds number in its header, and one sentence explains the difference — for example "At this resolution the simulated Reynolds number is ~10⁴, where thin sections lose lift to laminar separation; the panel method shows the high-Re value." When the lattice uses a frontal reference area the lattice values in this table are re-based on the chord so the two are comparable.
- Cp. The Pressure distribution chart (and the chart strip) draws the panel-method Cp as a dotted loop over the lattice curves; its suction peak is the attached-flow value a high-Re test would approach.
- Instant polar (Enthusiast and Engineer) sweeps −6° to 16° with the panel method in milliseconds and plots Cl and Cm against α. It is inviscid, so it never stalls — real sections stall near 12–16°. After an angle-of-attack sweep (Engineer) the lattice points are drawn alongside.
- Elsewhere. The Explain panel and the recommendations say so plainly when the simulated lift is far below the panel value at an effective Reynolds number under 10⁵, and reports add a "Lattice (Re_eff …) vs inviscid" table to the Results section and inviscid columns to the Cp section.
Use the panel method for full-scale lift and pitching moment, and the lattice for drag, separation, stall and trends.
Convergence
WindCanvas measures time in flow-throughs — the time the free stream takes to cross the tunnel (12 m at 20 m/s is 0.6 s of simulated time). A result is converged when the mean Cd and Cl change by less than 2 % between consecutive flow-through windows and at least two flow-throughs have passed since the last change. A shedding body converges in the mean while it oscillates; the oscillation is reported as unsteadiness. Changing the geometry, speed, fluid or tunnel restarts the clock. Reading a coefficient before it has converged is the most common mistake.
Fidelity
| Factor | Points | Full marks | Zero |
|---|---|---|---|
| Cells across the frontal height | 30 | 40 or more (half at 20) | Fewer than 10 |
| Simulated vs requested Re | 20 | Bluff: at least the smaller of Re_req and 2×10⁴. Airfoil: at least ½ Re_req | Bluff: below 10³. Airfoil: below 1 % of Re_req |
| Blockage | 15 | 5 % or less (half at 10 %) | 20 % or more |
| Convergence | 15 | Converged | Just started |
| Lattice speed u_lat | 10 | 0.05 or less (half at 0.1) | 0.17 or more |
| Dimensionality | 10 | A 2D body in 2D, or anything in 3D | A 3D body run in 2D |
Grades: A 85 and above (excellent), B 70–84 (good), C 50–69 (fair), D below 50 (rough). Each lost point comes with a note. To improve, raise the resolution or shrink the tunnel around the body (keeping blockage at or below 5 %), enlarge the tunnel if blockage is high, wait for convergence, use Target Re for textbook comparisons, and run 3D bodies in 3D.
Warnings and recommendations
Warnings state facts: Mach above 0.3, a high lattice Mach number, blockage over 10 %, cells reset after an instability, fewer than 30 cells across the body, a clamped Reynolds number, the wake reaching the outlet, no reference body, not converged yet. Recommendations come from 36 rules — rear separation, ride height, moving ground, blunt nose, stall, low angle, symmetric section, suction peak, separation bubble, cavitation, wave-making, vortex shedding, comparison with published Cd, resolution, blockage and more — sorted by severity. Why? shows the expected effect, a confidence and literature sources. Some have an Apply button (Enable moving ground, Enlarge tunnel, Raise resolution), and the change can be undone. Three of them flag numbers you should not trust yet:
- Underbody gap under-resolved (2D cars and other bodies on the floor): fewer than eight cells span the gap under the body. The moving road drags air into a slot the grid cannot resolve, so lift — and some drag — reads too high; the 2D sedan's lift halves when its gap gets six cells instead of three. Raise the resolution, or read Cl as qualitative. (The first-run sedan, at about six cells, shows it too.)
- Surface pressure above the total pressure: somewhere on the body Cp exceeds about 1.1, which steady flow cannot do. A slot or corner is too coarse for the grid (on a moving road, usually the belt pumping air into a thin gap); treat local pressures and lift as qualitative until it goes away.
- Lift far below the high-Re value (lifting sections): see Inviscid comparison.
Compare, sweeps and validation
Compare snapshots (Enthusiast and Engineer): Take snapshot stores the set-up, coefficients, Cp curve, wake, history and pictures. Tick up to four snapshots to compare Cd, Cl, L/D, Cm, Re, speed and fidelity, each with its percentage change from the first; Comparison CSV exports the table. Deleting a snapshot cannot be undone.
Sweeps (Engineer) run a series and plot a polar. Sweep is Angle of attack (default −4° to 16°, 11 points), Wind speed (half to double, 6 points) or Preset parameter; Points 2–61; Settle per point 0.5–50 flow-throughs (default 2; use 4 for shedding bodies). Run sweep shows progress, Cancel keeps the points measured so far, and the project is left unchanged. The result is a table (value, Cd, Cl, Cm, L/D, converged), a Cl–Cd polar or line chart, and Sweep CSV.
Validation (Engineer, or the Validation preset cards): Run or Run all applies each case's own tunnel and numerics, measures, marks pass or fail against the tolerance and restores your project. A case whose reference needs a higher Reynolds number than the grid can reach (NACA 0012 and the Ahmed body, which need at least 10⁵) is measured and shown as n/a (Re) instead — hover over the badge for the reason. It takes minutes; the cases and the measured results are listed in Validation cases.
Sweeps and validation runs step the solver in the background at full speed: they keep going when the window is not in front or the tab is hidden (a plain animation loop would slow to a crawl there), and the picture refreshes about four times a second while they run.
11. Reports, export and printing
Make report (Ctrl+Shift+R, every mode) opens a self-contained HTML report in a new window: A4 pages with the
charts and pictures embedded, so it works offline and can be emailed or archived. Print it, or save it as PDF from the
print dialog. Every coefficient carries its fidelity score, the effective Reynolds number and the caveats that apply. If
pop-ups are blocked, the report is downloaded instead and a message says so.
The Report tab (Enthusiast and Engineer) sets the Title, Author, Company, Logo (an image file up to 2 MB, embedded in the report), Units (SI or Imperial — the same setting as the interface) and Notes (the project notes). Sections: Setup, Geometry, Fluid, Results, Time histories, Cp distribution, Snapshots, Recommendations, Validation & fidelity, Methodology & assumptions, Numerical parameters, Comparison and Notes. Cp distribution and Comparison start ticked from Enthusiast mode, Numerical parameters in Engineer mode; sections with nothing to show are skipped unless you tick them. Output: Generate & open, Download HTML, Print report and Copy Markdown (a results table for a wiki or chat). For a lifting reference section the Results section adds a Lattice (Re_eff …) vs inviscid table — lattice, panel-method and thin-airfoil Cl, Cm about the quarter chord, lift slope and zero-lift angle, with the sentence that explains the gap — and the Cp distribution overlays the panel-method Cp and lists it beside the lattice values; the Markdown summary carries the same comparison in one line.
| Export | Contents |
|---|---|
| History CSV | t_s, cd, cl, cm (plus cs in 3D), time in simulated seconds |
| Cp CSV | side, x_m, y_m, x_over_c, s_m, t, cp, valid around the reference body |
| Wake CSV | station_x_m, y_m, u_m_s, u_over_Uinf, deficit behind the body |
| Probes CSV | Time, position, velocity, speed, pressure, Cp and density of each recorded probe |
| Sweep CSV (Engineer), Comparison CSV (Analysis) | The sweep table; the selected snapshots |
| PNG snapshot, SVG geometry, Project JSON | The current view; all shapes in metres; the whole project |
Files are named after the project. Text cells that start with =, +, - or @ get a leading apostrophe so a
spreadsheet never runs them as formulas. Print (Ctrl+P) prints the view and the results panel, swapping in a
snapshot of each view because WebGL pictures print blank.
12. Projects, autosave, appearance and shortcuts
The Project tab holds the Name, Author and Notes, and the buttons New (Ctrl+N), Open…
(Ctrl+O), Save (Ctrl+S), Save as… (Ctrl+Shift+S) and Duplicate.
- Save writes a
.windcanvas.jsonfile (a.windcanvasfile in the desktop app). Chrome and Edge show a Save dialog; other browsers download it. The file holds everything — settings, shapes, emitters, probes, annotations, snapshots, theme, custom colormaps and imported 3D models — and moves freely between computers. It is your real copy. - Open…, or dropping the file on the window, loads a project. New and Open warn about unsaved changes, and so does closing the tab. Snapshot pictures and the report logo must be embedded in the file, as WindCanvas saves them; a link to a picture elsewhere is dropped on opening, so opening a file never fetches anything.
- Recent projects lists names, dates and thumbnails as a reminder; reopen one with Open….
Autosave writes a copy to the browser's storage 10 seconds after each change and when you leave the tab, and restores
it the next time you open WindCanvas. It leaves out snapshot pictures, keeps large 3D models only where the browser offers
extra storage (otherwise just their silhouette), skips anything over 2 MB, and is lost in private windows, when browser
data is cleared, or when the file is moved. An amber dot beside the project name
means storage is blocked. Save with Ctrl+S whenever the work matters. To start fresh without restoring, add ?new to
the address, as in WindCanvas.html?new.
Appearance: Theme (Dark, Light, Blueprint, Midnight, High contrast, Lab, Sunset — from the top bar, the View tab or the Project tab), Background texture (None, Engineering grid, Blueprint grid, Dots, Carbon fibre, Hex mesh, Paper), Units (SI or Imperial), Font size (80–140 %), Density (Compact, Normal, Comfortable), Reduce motion, Show the chart strip and Show the tool rail. Changes apply instantly and never touch the simulation.
Licence: Free, Maker, Pro and Schools
WindCanvas is free to use, in the browser and on Windows. A licence key unlocks more on the computer it is activated on:
| Free | Maker | Pro | Schools | |
|---|---|---|---|---|
| Resolution | 2D Low and Medium; 3D Low | Every size, 2D and 3D | Every size | Every size |
| Grid refinement around the body | — | Yes | Yes | Yes |
| Import | Photos and sketches, project files, geometry JSON | Also SVG, DXF, PDF and 3D models | As Maker | As Maker |
| Saving and exporting project files | Autosave only | Yes | Yes | Yes |
| Reports | With a "WindCanvas Free" watermark | Clean | Clean, with your logo | Clean |
| Validation suite, sweeps, CSV data export | — | — | Yes | — |
| Use | Personal and educational | Personal | Commercial too | One school, every computer, students' home use |
Activating. Click the plan badge at the right of the top bar (it reads Free · Upgrade), or open Project → Licence → Enter licence key…, paste the key from the receipt email and choose Activate. Activation needs the internet once; afterwards the key works offline and is re-checked about once a week when the computer is online. If it cannot be checked for more than 30 days, WindCanvas runs as Free until it can, and the key stays stored. A refunded or expired key returns the computer to Free at the next check.
Buying. When you reach something your plan doesn't include, the dialog that explains it has a Buy Maker (or Buy Pro) button that opens the secure checkout at windcanvas.com in your browser; Compare all plans and Help → Plans and pricing open the plans page. The key arrives by email straight after payment. These links tell the website which part of the app they came from, nothing else.
Moving a key. Project → Licence → Licence… → Deactivate frees this computer's activation, so the same key can be activated on another computer.
What is sent. Activating, checking and deactivating send only the key, WindCanvas's shop ID and a device name such as "WindCanvas · Windows desktop · 3f9a1c" to Polar, the reseller that sells WindCanvas licences. Nothing about your projects or your computer leaves it.
When a project uses something the plan does not include (a project saved at Ultra resolution, say), WindCanvas runs it at the plan's limits and says so; nothing in the project file is lost.
Keyboard shortcuts
Press ? in the app for the full list. Letter keys are ignored while you type in a field.
| Playback and view | Tools | ||
|---|---|---|---|
Space | Play / pause | V | Select / move |
. | Step once (one frame of lattice steps) | H | Pan tool (hold: temporary pan) |
Shift+N | Step exactly one lattice step (or Shift+click Step once) | ||
Shift+R | Reset flow | B / E | Brush / Eraser |
5 | Toggle smoke | P | Polygon |
1 2 3 4 | Field: none, speed, pressure, vorticity | R / O | Rectangle / Ellipse |
F | Fit tunnel in view | S / A / L | Spline / Airfoil / Plate |
G | Toggle grid | T / M | Text note / Measure |
Tab | Show / hide the Inspector | Q / K | Probe / Smoke wand |
| Wheel, pinch | Zoom | [ / ] | Brush smaller / larger |
| Middle, right or two-finger drag | Pan | Alt+wheel | Brush size |
| Editing | App | ||
|---|---|---|---|
Del / Backspace | Delete selection | Ctrl+S / Ctrl+Shift+S | Save / Save as |
Enter | Close polygon or spline | Ctrl+O / Ctrl+N | Open / New project |
Backspace (drawing) | Remove the last point | Ctrl+P | |
Esc | Cancel gesture, then clear selection | Ctrl+Shift+R | Make report |
Arrows, Shift+arrows | Nudge 1 or 10 cells | Ctrl+K | Command palette |
Shift / Alt (dragging) | Snap angle 1°, scale 5 % / scale about centre | Ctrl+Shift+C | Clear menu |
Ctrl (drawing, moving) | Invert snap to grid for this gesture | ||
Ctrl+Z | Undo | Ctrl+V | Paste image, SVG, DXF or JSON |
Ctrl+Y / Ctrl+Shift+Z | Redo | ? | Shortcuts overlay |
Ctrl+D / Ctrl+G | Duplicate / Group | F1 | Glossary |
Ctrl+A / Ctrl+L | Select all / Lock | Shift+click a preset | Swap Replace and Add |
13. Physics and accuracy
This section states what the solver does, how physical inputs map to lattice parameters, how results are measured and where they stop being trustworthy. Help → Physics & accuracy in the app covers the same ground.
The method
WindCanvas uses the lattice Boltzmann method — D2Q9 in 2D, D3Q19 in 3D — in WebGL2 shaders on 32-bit float textures, with one fused pull-stream-and-collide pass per step; 3D is stored as a 2D atlas of z-slices. At small lattice Mach number the scheme recovers the incompressible Navier–Stokes equations, and because it is local and explicit, the geometry can change every frame.
fᵢ(x + eᵢ, t + 1) = fᵢ(x, t) − [fᵢ(x, t) − fᵢ^eq(ρ, u)] / τ_eff (BGK)
ρ = Σ fᵢ ρu = Σ eᵢ fᵢ p = ρ·cs² cs² = 1/3
Collision models (Numerics → Collision). BGK, above, relaxes every population with one rate. As τ approaches ½ — the low viscosity that air at real speeds needs — it also over-relaxes the lattice's non-hydrodynamic "ghost" modes, which then blow up; that is why BGK needs a τ floor of about 0.505 and caps the Reynolds number. The 2D solver offers two operators that tame those modes (Coreixas, Wissocq, Chopard & Latt 2020 compared them on this lattice and found them the most stable at low viscosity):
- Cumulant (Geier et al. 2015): relaxes the statistically independent moments of the populations — the shear stress with the viscosity, the bulk part and the higher cumulants straight to equilibrium (with Geier's limiter available for the third-order ones).
- Recursive regularised (Malaspinas 2015; Coreixas et al. 2017): rebuilds the non-equilibrium part of the populations from the shear stress alone (plus its recursive higher-order extension) and discards the rest.
Both relax toward the full tensor-product equilibrium of D2Q9 and use the same Smagorinsky closure. TRT (two relaxation times, Λ = 3/16) is also available; the 3D solver offers BGK and TRT.
Lattice units and the effective Reynolds number
dx = L_tunnel / nx dt = u_lat · dx / U∞ ν_lat = ν · dt / dx² τ = 3·ν_lat + ½
Re_requested = U∞ · L_ref / ν Re_effective = u_lat · (L_ref / dx) / ν_lat,used Ma_lat = u_lat · √3
In Physical mode the solver starts at u_lat = 0.05. If the required τ is below τ_min, it raises u_lat towards u_lat max (0.1), because ν_lat grows with u_lat. If τ is still too small, it runs at τ_min and reports "clamped", with Re_effective below Re_requested. In Target Re mode ν = U∞·L_ref / Re_target, and u_lat is lowered (not below 0.005) if τ would exceed τ_max (2).
τ_min depends on the collision model (with Auto τ min, the default): each model was run on the GPU at ever smaller τ on the default car and a cylinder until the stability guard had to reset a cell, and the floor sits a safety factor above the lowest τ that stayed clean — Cumulant and Recursive regularised 0.5001, BGK 0.505 (it resets at 0.501 on the car), TRT 0.52 (below that it lets even an empty tunnel's uniform stream drift). With C_s = 0 (no subgrid model) each model has a higher floor (Cumulant 0.501, the others 0.52 as before). Turn Auto off to type your own τ min.
Example — the first-run sedan. Its 25 m tunnel at Medium resolution gives dx = 4.88 cm, so the 4.86 m car spans about 100 cells. Re_requested = 20 × 4.86 / 1.46×10⁻⁵ ≈ 6.7×10⁶. Even at u_lat = 0.1 that needs τ − ½ ≈ 4×10⁻⁶, so τ is clamped at the floor. With BGK (τ_min 0.505, ν_lat = 1.67×10⁻³) Re_effective = 0.1 × 100 / 1.67×10⁻³ ≈ 6 000; with the default Cumulant model (τ_min 0.5001, ν_lat = 3.3×10⁻⁵) it is about 300 000 (the status bar shows it). The full Reynolds number would need τ − ½ ≈ 4×10⁻⁶ or about 110 000 cells along the car.
The subgrid model does not recover the missing Reynolds number, so Re_effective is an upper bound on what is simulated. Bluff-body drag changes only weakly with Re in the sub-critical range (about 10³ to 2×10⁵), especially for sharp-edged bodies, but the drag crisis of rounded bodies — a cylinder falls from Cd ≈ 1.2 to about 0.3 above roughly 2×10⁵ — is never reproduced. Airfoil maximum lift, stall angle and drag depend strongly on Re. The Engineer LES activity readout (mean ν_t/ν in the wake) shows how much of the flow is modelled rather than resolved. More cells across the body is the only real lever.
Turbulence model
Π_αβ = Σᵢ e_iα e_iβ (fᵢ − fᵢ^eq) Q = √(2 · Σ Π_αβ Π_αβ)
τ_eff = ½ · [τ₀ + √(τ₀² + 18 · C_s² · Q / ρ)] ν_t = (τ_eff − τ₀) / 3 ≥ 0
This is the Smagorinsky closure ν_t = (C_s·Δ)²·|S| with Δ = one cell and C_s = 0.12 by default. In 3D it is a large-eddy subgrid model. In 2D it is only a numerical stabiliser, because two-dimensional turbulence has no forward energy cascade.
Boundary conditions
- Inlet: velocity boundary with the chosen profile; density from the neighbouring cell and non-equilibrium extrapolation (Guo, Zheng & Shi 2002). The first ten columns have a relaxation-time floor, τ ≥ ½ + 0.1·(1 − x/10)², which damps modes the inlet would otherwise amplify without changing the prescribed inflow.
- Outlet: ρ = 1 with the velocity extrapolated from the previous column, or convective outflow (Outlet in Flow → Inlet & outlet), always preceded by the absorbing layer described below.
- Walls: free-slip is specular reflection, no-slip is halfway bounce-back, periodic wraps round. Moving ground is bounce-back with a momentum correction; in 2D and 3D the first fluid row above it has τ ≥ 0.52 to stop a wave travelling along the belt, and the correction is limited so that no population can go negative. Where a body stands on the belt (wheels on the ground) the belt cannot run into it — a stationary outline cannot roll, and a full-speed belt sliding under it is a numerical singularity: in 2D the belt speed tapers to zero over 4 cells next to it; in 3D the belt stops on a small pad under and around each contact patch (2 cells along the flow, one cell to the sides), like the stationary wheel pads of some real tunnels. Without the pads the belt pumped the one-cell wedge in front of each tyre to a pressure coefficient of about +10 (−14 behind it) and added about half again to a car's 3D drag.
- Bodies: in 2D, curved walls by default (Numerics → Walls): for every lattice link from a fluid cell into the body,
WindCanvas computes where the true outline cuts the link (an exact intersection with the shape's polygon, respecting
subtract shapes and the eraser) and the returning population is interpolated accordingly (Bouzidi, Firdaouss &
Lallemand 2001):
2q·f_d(x) + (1 − 2q)·f_d(x − e_d)when the wall is less than half a link away,(f_d + (2q − 1)·f_d̄)/(2q)otherwise. A round nose or a leading edge two or three cells thick then keeps its true shape instead of becoming a row of steps. The distances are recomputed with every mask change, including live brush, eraser and drag edits. In 3D the same rule runs on all 18 links of every boundary cell: a voxelised body (preset, imported model, revolved shape) has each link traced against its own triangle mesh when it is voxelised, and an extruded shape takes its side walls from the 2D outline and its two end caps from its exact depth. Staircase is halfway bounce-back on the rasterised mask: the wall sits halfway between the last fluid and the first solid cell. A cell that turns from solid to fluid starts at f^eq(ρ_neighbours, 0), which keeps live painting stable. - Refinement patch (2D, optional): a second lattice at dx/2 and dt/2 (τ_f = 2τ − ½, the same lattice velocity) covers the bodies. Its outer ring of cells is rebuilt before each of its two sub-steps from the main grid — density, velocity, eddy viscosity and the non-equilibrium stress interpolated bilinearly in space and linearly in time, the stress scaled by (τ_f − 1)/(2(τ − 1)) and the populations rebuilt in regularised form — and after them every main-grid cell inside the patch (except a one-cell overlap band at its edges) takes the patch's mean density and velocity while keeping its own non-equilibrium part. Where the patch reaches the floor or ceiling the tunnel's wall rule (moving belt included) applies at full resolution.
- Start: impulsive, with f^eq(1, u_inlet) everywhere, unless a Start-up ramp is set.
The absorbing outlet layer
A velocity inlet and a pressure outlet turn the tunnel into a lightly damped quarter-wave resonator with a period of about 4·nx/cs steps. Vortex shedding can lock onto it: the inlet density oscillates, the outlet flows backwards at times, and Cd, Cl and the Strouhal number drift. WindCanvas therefore damps the last 8 % of the tunnel length (4 to nx/4 columns; 41 at nx = 512) in 2D and 3D. After collision, the equilibrium part of each population relaxes towards f^eq(1, ū) at a rate 0.1·ξ², where ξ runs from 0 to 1 across the layer (Xu & Sagaut 2013) and ū is a running mean of the local velocity (time constant 8·√3·nx steps; its streamwise part is never negative). A pressure wave that crosses the layer twice keeps about 1 % of its amplitude and vortices are damped, while mean profiles such as boundary layers and wake deficits pass through unchanged. Keep the body, its near wake and every measurement upstream of the last 8 %. Presets put the body's nose 30 % of the way along the tunnel. In the 2D view, Enthusiast and Engineer modes shade the layer and label it "absorbing outlet" (section 8). The layer is not a setting: it is always on, in 2D and 3D.
Forces and coefficients
Forces come from momentum exchange: each population that bounces back from a solid cell hands 2·(fᵢ − wᵢ·ρ∞)·eᵢ to the body (with curved walls the population that comes back differs from the one that left, and the exchange is (fᵢ + f_returned − 2·wᵢ·ρ∞)·eᵢ — the form of Wen et al. 2014 for a stationary wall). For a body surrounded by fluid the ρ∞ term cancels and this is the classic 2·fᵢ·eᵢ; for a body touching the floor (wheels on the ground) it stops the ambient pressure of the contact cells from being counted as a huge downforce — the floor carries that load in reality. Every Forces every steps, the GPU sums this over all boundary links, for the total and for up to eight tracked shapes, and measures the mean inlet density. Each force sample, in 2D and 3D, is the mean of two consecutive steps: at the lowest relaxation time (τ ≈ 0.505, where most real-world air flows end up) the populations next to a bluff body can alternate between two states from one step to the next, and a single step read up to twice the true force (or almost none) — the default 3D sedan's drag was doubled this way until the 3D validation of October 2026, which checked the forces against an independent momentum balance of the flow. In 2D the alternation appears over a moving belt and is smaller (the first-run sedan: ±0.07 in Cd from step to step). Coefficients are formed in lattice units, so no unit conversion can corrupt them:
q_lat = ½ · ρ∞ · u_lat² (ρ∞ = mean density on the inlet column)
A_lat = A_ref / (dx · span) in 2D, A_ref / dx² in 3D; L_lat = L_ref / dx
Cd = Fx / (q_lat·A_lat) Cl = Fy / (q_lat·A_lat) Cs = Fz / (q_lat·A_lat) Cm = −Mz,ref / (q_lat·A_lat·L_lat)
2D: F = F_lat · ρ · dx³/dt² × span [N] 3D: F = F_lat · ρ · dx⁴/dt² [N]
Cp = (ρ − ρ∞)·cs² / (½·ρ∞·u_lat²) p_gauge = (ρ − ρ∞)·cs²·ρ_phys·(dx/dt)² [Pa]
Signs: +x is downstream (Fx > 0 is drag), +y is up (Cl < 0 is downforce), +z is across the tunnel, and Cm > 0 is nose-up. Force samples are uniform in simulated time; the history keeps up to 65 536 samples over the last 600 simulated seconds.
Analysis definitions
- Cp, separation, boundary layer: sampled 1.5 cells outside the reference outline, along its normal. The stagnation point is the highest Cp where the flow divides at the front (see below). Separation and reattachment are where the tangential velocity crosses ∓2 % of u_lat for two consecutive samples, walking from the front stagnation point to the rear; positions are fractions of the streamwise length.
- Wake: measured one reference length behind the body; width where 1 − u/U∞ > 10 %; recirculation length = the last centreline point with u < 0. Both are averaged over about half a flow-through.
- Convergence: windows of max(T_ft, 2000) steps, where T_ft = L_tunnel / U∞. Converged when the drift of the mean Cd (and of Cl, relative to max(|Cl|, 0.05·|Cd|)) is below 2 % and at least 2·T_ft have passed since the last change. Convergence = clamp(1 − drift/0.02, 0, 1) × min(1, t / 2·T_ft). When there is a clear shedding peak, the averaging and drift windows are rounded to whole shedding periods, so a shedding body's means do not depend on where a window cuts its cycle.
- Stagnation point and peak pressure: the stagnation point is the front one, where the flow divides; the highest surface Cp anywhere (it can be in an under-resolved gap under a car) is reported separately and drives the Surface pressure above the total pressure warning.
- Strouhal: the latest Cl samples (up to 4096, spanning at least 8·T_ft when available), Hann window, FFT, peak above 2/(N·Δt). St = f·h_ref / U∞; confidence = power in the main lobe ÷ total power.
Stability, playback and readback
Local speeds above the Velocity clamp (0.35) are rescaled, and a cell with ρ outside [0.5, 1.5] or any fᵢ outside [0, 1] is reset. Safety net: when τ sits on its floor (below 0.505) and cells keep being reset — in two readbacks in a row — WindCanvas raises the τ floor for the rest of that run (τ_min − ½ grows 2.5× per step, up to 0.505) and a message gives the old and new τ and Re_effective; the floor returns to the measured one when you load a project or change the collision model or τ settings. If more than 0.1 % of the cells reset in one readback, the floor is raised the same way and the field restarts; once the floor is at 0.505 the old rule applies: the field restarts with u_lat 20 % lower (not below 0.02) and a message names the likely cause. Simulated time is steps × dt, never wall-clock time. The field is read back asynchronously, about 4 times a second in 2D and 3 in 3D. After a resize the new grid is seeded from the old field and the inlet ramps up from 85 % over about 0.3 s.
2D versus 3D, and blockage
A 2D section is an infinitely wide body: no flow round the sides, no tip vortices and a stronger wake. A 2D car silhouette can read several times the real car's Cd, and a 2D airfoil lifts more than a finite wing. Use 2D for trends, comparisons and genuine sections, and 3D for the flow round the sides and for comparing 3D variants. 3D forces are measured correctly (validated on a sphere and a cylinder, and against the momentum balance of each run), but at the 13–24 cells a browser grid puts across a bluff body its drag is still about 2.5–3 times the real value (the default sedan ≈ 0.73 against ≈ 0.3, the Ahmed body ≈ 0.9 against 0.285; it falls as the grid gets finer), so do not read 3D drag as an absolute number either — use 3D to compare variants. Blockage — frontal height ÷ tunnel height in 2D, frontal area ÷ cross-section in 3D — is reported but never corrected; as a rough guide it biases Cd by one to two times the ratio.
Validation cases
Each case carries its own tunnel, resolution and numerics; no accuracy claim is made at the default resolution.
| Case | Set-up | Expected | Measured (laptop GPU) | Source |
|---|---|---|---|---|
| Cylinder, Re = 100 | 40 × 20 m, 1280 cells (D = 32 cells), 5 % blockage, C_s = 0, Target Re, 30 flow-throughs | Cd 1.35 ± 0.08; St 0.165 ± 0.010 | Cd 1.387, St 0.169 — pass (1.415 / 0.168 with BGK on staircase walls) | Williamson 1996; Tritton 1959 |
| Poiseuille channel, Re_H = 20 | 8 × 1 m, 512 cells, no-slip walls, C_s = 0, 8 flow-throughs | u_centre / u_mean 1.50 ± 0.03; parabola r² > 0.99 | 1.498 — pass | Analytic |
| Flat plate ⊥, Re = 400 (2D) | 40 × 15 m, 1280 cells (32 across the plate), 6.7 % blockage, slip walls, C_s = 0, Target Re, 15 flow-throughs | Cd 2.30–3.35 (the spread of published 2D results); St 0.150–0.170 | Cd 3.18, St 0.154 — pass (3.23 / 0.152 with BGK on staircase walls) | Rosin et al. 2026 (2D: Cd 2.43, St 0.160); earlier 2D studies ≈ 3.2 |
| NACA 0012 at 4°, Re = 10⁵ | 12 × 6 m, 2048 cells (≈ 20 across the thickness), C_s = 0.1, 6 flow-throughs; reaches Re_eff ≈ 10⁴ | Cl 0.44 ± 0.08, judged only at Re_eff ≥ 10⁵; Cd reported, not validated | Cl 0.11 — n/a (Re) (panel method: 0.48) | Abbott & von Doenhoff 1959 |
| Ahmed body 25° (3D) | 4.2 × 1.2 × 1.2 m, Ultra, moving ground, 40 m/s, 6 flow-throughs; reaches Re_eff ≈ 1.4×10⁵ (cumulant; 3×10³ before 1.2.0) at 13 cells across its height | Cd 0.285 ± 0.06, judged only at Re_eff ≥ 10⁵ and ≥ 40 cells across the body | Cd 0.91 (1.17 before 1.2.0) — n/a (grid) | Ahmed, Ramm & Faltin 1984 |
| Sphere, Re = 100 (3D) | 12 × 5.125 × 5.125 m, 192 cells (D = 16 cells), 3 % blockage, slip walls, C_s = 0, Target Re, 5 flow-throughs | Cd 1.09, accepted 1.0–1.2 | Cd 1.17 with curved walls on the true frontal area πD²/4 (staircase voxels: 1.22 on πD²/4, 1.18 on their own silhouette), no lift or side force — pass | Schiller & Naumann 1933; Clift, Grace & Weber 1978 |
The default 12 × 6 m tunnel with a 1 m cylinder (blockage 1/6) is not a valid set-up for the cylinder case. The flat plate is a 2D case at Re = 400 because the familiar Cd ≈ 2.0 of wind-tunnel plates belongs to a three-dimensional wake that no 2D simulation reproduces; published 2D computations disagree (2.43 in the most recent, about 3.2 in earlier ones), and WindCanvas settles at 3.23–3.26 on staircase walls however fine the grid (3.18 with curved walls) — inside that spread, but well above the newest reference. The measured values are those of the default numerics (cumulant collision, curved walls, automatic τ min). Cases marked n/a (Re) are measured and reported, not judged: their reference values only apply at Reynolds numbers of 10⁵ and above, which a browser grid cannot reach.
Measured on a laptop GPU (300 000 solver steps on the 2D stability bench, tools/gpu-tests/lbm2d-stability.html):
a Re = 100 cylinder with 40 cells across the diameter, 5 % blockage and C_s = 0 gave Cd = 1.417 ± 0.008 and St = 0.170,
inside the expected ranges, with the inlet density steady to ±5×10⁻⁵. An empty tunnel over a moving floor stayed uniform
to |Δρ| ≤ 2×10⁻⁵. A sedan at 22 % blockage kept its inlet density between 0.998 and 1.012 (mean 1.006 — the small
inlet over-pressure that balances the car's drag, 1.0055 predicted), with no backflow at the outlet. Before the absorbing
outlet layer and the inlet and belt stabilisers existed, the inlet density of these runs swung between about 0.74 and
1.45 and the cylinder read Cd 2.3 ± 8.1.
3D, measured the same way (October 2026, tools/gpu-tests/force3d-harness.js): the sphere case reads Cd 1.18 (1.22
on the geometric area πD²/4) with no lift or side force; the reading falls on finer grids and in wider tunnels (1.25, 1.22 and 1.20 on πD²/4 at 12, 16 and 20 cells across) and extrapolates to 1.07–1.10 — the textbook value. A cylinder spanning a 3D tunnel with periodic
sides gives Cd 1.420, Cl rms 0.247 and St 0.167 — the 2D solver's numbers to 0.02 %. Each of these forces, and the
sedan's, agrees with an independent momentum balance of the simulated flow (momentum and pressure flowing through two
cross-sections of the tunnel) to about 1 %. That check found three defects in the 3D path, all fixed: the force was
sampled on every fourth step only, while near the lowest relaxation time the populations next to a bluff body alternate
from step to step (the sedan read twice its drag); the moving belt slid under the car's fixed voxel wheels (half again
more drag); and the sedan's wheels were voxelised one cell wider on one side than the other (a false side force).
1.2.0 additions (the solver-v2 benchmark suite, laptop GPU; details in docs/SOLVER_V2_BENCHMARKS.md in the source):
| Case | Before 1.2.0 | 1.2.0 | Reference |
|---|---|---|---|
| Sphere, Re = 100, D = 16 (3D) | Cd 1.22 (staircase voxels, BGK; on πD²/4) | Cd 1.17 (cumulant, curved walls, true frontal area) | ≈ 1.13 at this blockage (1.09 unconfined) |
| Sphere, Re = 300, D = 20 (3D, 4 of 40 flow-throughs) | not run | Cd 0.717 | 0.656 unconfined (Johnson & Patel 1999) |
| Cylinder, Re = 100, D = 10 cells (2D) | Cd 1.484 (staircase) | Cd 1.404 (curved); 1.368 with the 2× refinement patch | 1.353 at this blockage |
| Cylinder, Re = 100, D = 20 cells (2D) | Cd 1.412 (1.0.1) | Cd 1.383, St 0.168 — pass | 1.353, St 0.166–0.168 |
| Cylinder, Re = 1000, D = 48 (2D, 5 of 10 flow-throughs) | Re_eff only 720 (τ clamped) — not validated | Re 1000 matched: Cd 1.548, St 0.243 — pass | Cd 1.48–1.53 unconfined (≈ 1.55 at this blockage), St 0.241–0.25 |
| NACA 0012 at 4°, Re = 1000 (2D, 4 of 6 flow-throughs) | not measured | Re 1000 matched: Cl 0.207, Cd 0.127 — pass | Cl ≈ 0.20, Cd ≈ 0.125 (Kurtulus 2015; Di Ilio 2018) |
| Ahmed body 25° (3D) | Cd 1.17 at Re_eff 3×10³ | Cd 0.91 at Re_eff 1.4×10⁵ — n/a (grid: 13 cells across its height) | 0.285 at Re 4.3×10⁶ |
The refinement patch takes the D = 10 cylinder to within about 1 % of the uniform D = 20 grid at a quarter of its run time (87 s against 370 s; 1.7 times the plain D = 10 run). Its Strouhal number (0.1645) sits between D = 10 and D = 20 because part of the vortex-formation region lies behind the patch. Every 1.2.0 run above finished without a guard reset.
Known limitations
- Incompressible flow only: results drift above Mach 0.3, and the lattice adds an error ∝ Ma_lat² (0.75 % at u_lat = 0.05, 3 % at 0.1).
- No free surface, waves, cavitation, heat transfer or buoyancy; temperature only sets the fluid properties. Marine bodies are deeply submerged.
- No moving or rotating bodies apart from the moving ground; propellers and turbines are 2D sections.
- Reynolds-number shortfall, no drag crisis and no transition model; 2D "turbulence" is only stabilised.
- No wall functions; the curved walls follow the outline between cells in 2D and 3D, but features thinner than about three cells are still unreliable.
- No blockage correction; the last 8 % of the tunnel is a damping layer; 3D grids are coarse — about 16 cells across a car — so absolute 3D drag of a real vehicle still reads high (section 9); compare 3D variants rather than trusting it.
- Local refinement is 2D only and uses one patch at 2×; the recursive-regularised model needs τ ≥ 0.506 in 3D (it goes quietly unstable below), so the cumulant model is the one to use there.
- In 2D, solid wheels seal the gap under a car and trap air over the road (a test sedan read Cl ≈ +3), so preset cars draw their wheels as visual-only parts — which in turn means the wheels' own effect on the flow is not simulated in 2D.
References
Krüger et al., The Lattice Boltzmann Method, Springer 2017 · Guo, Zheng & Shi, Chinese Physics 11, 2002 · Smagorinsky, Mon. Weather Rev. 91, 1963; Hou et al., 1996 · Xu & Sagaut, J. Comput. Phys., 2013 · Williamson, Annu. Rev. Fluid Mech. 28, 1996 · Tritton, J. Fluid Mech. 6, 1959 · Ahmed, Ramm & Faltin, SAE 840300, 1984 · Abbott & von Doenhoff, Theory of Wing Sections, 1959 · Hoerner, Fluid-Dynamic Drag, 1965 · Hucho, Aerodynamics of Road Vehicles · Schiller & Naumann, 1933; Clift, Grace & Weber, Bubbles, Drops and Particles, 1978 (sphere drag) · Rosin, Chapman, Protas & Martinuzzi, arXiv:2601.17341, 2026 (2D flat plate at Re = 400) · Kuethe & Chow, Foundations of Aerodynamics (vortex panel method) · Geier, Schönherr, Pasquali & Krafczyk, Comput. Math. Appl. 70, 2015 (cumulant LBM); Geier, Pasquali & Schönherr, J. Comput. Phys. 348, 2017 (parametrisation and limiters) · Malaspinas, arXiv:1505.06900, 2015; Coreixas, Wissocq, Puigt, Boussuge & Sagaut, Phys. Rev. E 96, 033306, 2017 (recursive regularisation) · Coreixas, Wissocq, Chopard & Latt, Phil. Trans. R. Soc. A, 2020, arXiv:2002.05265 (collision models compared) · Bouzidi, Firdaouss & Lallemand, Phys. Fluids 13, 3452, 2001 (interpolated bounce-back) · Wen, Zhang, Tu, Wang & Fang, J. Comput. Phys. 266, 2014 (momentum exchange).
14. Troubleshooting
"Flow simulation needs WebGL2 with float textures." The browser could not provide a hardware-accelerated WebGL2 context; click How to fix on the banner.
- Chrome / Edge: Settings → System → turn on "Use graphics acceleration when available", relaunch, then check that
chrome://gpu(oredge://gpu) shows WebGL2 as "Hardware accelerated". - Firefox: Settings → General → Performance → untick "Use recommended performance settings", tick "Use hardware
acceleration when available"; in
about:config,webgl.disabledmust be false. - Safari: keep macOS or iOS up to date; under Safari → Settings → Advanced, enable the developer features and make sure the WebGL 2.0 feature flag is on.
- Otherwise update the graphics driver, close other heavy 3D tabs or try another browser. Help → About WindCanvas shows the graphics card the browser reports.
Slow or jerky. Set Power to Maximum (top bar), and check it is not on Battery saver because the laptop is unplugged. Lower the resolution (each step down quarters the 2D cells). Keep Playback rate on Auto. Close other GPU-heavy tabs, including other WindCanvas tabs. Use fewer or thinner smoke streams, and switch off LIC smear and Streamlines when not needed. In 3D, use Low and fewer streamlines. Plug a laptop in. A low real-time factor on a big grid is normal.
The flow reset itself. A numerical blow-up was caught. Thicken very thin features (at least three cells), smooth jagged corners (Object → Outline), lower the speed or raise the resolution. In Engineer mode keep the Smagorinsky model on and the collision on BGK; TRT is less robust when τ is close to ½.
Smoke looks wrong. Crawling smoke reflects slow simulated time — use Smoke speed × (visual). Broken streaks: raise Smoke volume flow (or the particle budget). Smoke missing the body: move Injection centre Y. An empty wake: raise Particle life or add a surface emitter. A smeared picture: lower Trail length or Clear trails.
The numbers look wrong. Check, in order: convergence; the fidelity notes; the reference body (REF) and its reference area; 2D on a 3D body; blockage above 5 %; simulated versus requested Re (critical for airfoils); Mach above 0.3; a body facing the wrong way (the nose must point left); the real length of an import; enough tunnel before and behind the body — nothing you measure should sit in the shaded absorbing outlet band; and, for a car in 2D, whether its wheels are Solid (they seal the underbody and add a large false lift) rather than Visual only.
| Import message | What to do |
|---|---|
| "This is not a format WindCanvas can open." | Use one of the formats in section 6. |
| "This browser can't decode this image format." | Export JPEG or PNG first (iPhone photos are often HEIC). |
| "This file is too large to import." | Reduce its pixels, triangles or layers. |
| "No outline has been found in this image yet." | Try another Mode, raise Tolerance, crop closer or paint with the Keep brush. |
| "The outline isn't closed …" | Raise Gap closing or close the line with the Keep brush. |
| "This is a binary DXF file." | Save as ASCII DXF. |
| "This .gltf refers to files that were not dropped with it." | Drop the .bin and textures with the .gltf, or export .glb. |
| "This model uses Draco or Meshopt compression." | Re-export without compression. |
| "That was a link, not a file." | Save the picture first, then drop the file. |
| "3D model not restored — re-import it" | The autosave kept only the silhouette: import the model again, then save the project. |
The report did not open. The pop-up was blocked, so the report was downloaded instead; allow pop-ups for WindCanvas to
open reports directly. My work was not restored. The autosave is lost in private windows, after clearing browser data
or when the file moves; keep saved .windcanvas files. A control is missing. Check the mode, use Show advanced
controls…, or find it with Ctrl+K; 3D options appear only in 3D. Self-test: add ?selftest to the address, or run
WT.App.selfTest() in the developer console.
15. Glossary
| Term | Meaning |
|---|---|
| Absorbing outlet layer | The last 8 % of the tunnel, where the solver damps waves and vortices so they do not reflect off the outlet; readings inside it are not physical. |
| Angle of attack | Angle between a body's chord and the oncoming flow; nose-up is positive. |
| Blockage ratio | Body frontal area ÷ tunnel cross-section. Above 5–10 % the walls inflate the forces. |
| Boundary layer | Thin layer next to a surface where the flow slows to zero at the wall. |
| Camber | Curvature of an airfoil's mean line; gives lift at zero angle. |
| Cd, Cl, Cm | Drag, lift and pitching-moment coefficients: force or moment ÷ (½ρU² × reference area [× length]). |
| Cd·A | Drag area: Cd × reference area, independent of the area chosen. |
| Chord | Straight line from an airfoil's leading to trailing edge; its reference length. |
| Convergence | Running averages settled: drift below 2 % after at least two flow-throughs. |
| Cp | Pressure coefficient (p − p∞) ÷ ½ρU²: 1 at stagnation, negative in suction. |
| Downforce | Negative lift, pressing a vehicle onto the road. |
| Dynamic pressure q | ½ρU²; every force scales with it. |
| Fidelity score | 0–100 trust score for a result; grades A–D. |
| Flow-through time | Time for the free stream to cross the tunnel, L ÷ U. |
| Free-slip / no-slip wall | Frictionless wall / sticky wall that grows a boundary layer. |
| Froude number | U ÷ √(g·L); governs wave-making, which is not modelled. |
| Frontal / planform area | Reference area for vehicles and bluff bodies / for wings (chord × span). |
| Isobar | Line of equal pressure. |
| Kamm tail | Rear end cut off where a full taper would get too long. |
| Laminar / turbulent | Smooth, layered flow / chaotic, mixing flow. |
| Lattice Boltzmann method | Particle populations stream between cells and collide; the solver's method. |
| LES, Smagorinsky model | Subgrid model adding eddy viscosity where the grid cannot resolve the shear. |
| LIC | Line integral convolution: a texture smeared along the flow for a smoke-like look. |
| L/D | Lift ÷ drag, the efficiency of a wing. |
| Mach number | U ÷ speed of sound; below 0.3 the flow is effectively incompressible. |
| Moving ground | A floor moving at wind speed, like a road under a car. |
| Panel method | Instant inviscid solver: vortex panels on the outline plus the Kutta condition; lift and Cp of attached, frictionless flow (high-Re limit), no drag, no stall. |
| Q-criterion | Vortex detector: positive where rotation beats strain. |
| Real-time factor | Simulated seconds per real second. |
| Reattachment, recirculation | Separated flow returning to the surface; reversed flow behind a body. |
| Reference body | The shape whose length sets Re and whose area normalises the coefficients. |
| Reynolds number | U·L ÷ ν, inertia versus viscosity; shown as requested and simulated. |
| Separation | Where the boundary layer leaves the surface; the main source of bluff-body drag. |
| Stagnation point | Where the flow comes to rest on the body; Cp = 1. |
| Stall | Upper-surface separation near a wing's leading edge; lift collapses. |
| Streakline / streamline | Line of particles released from one point (what smoke shows) / curve tangent to the velocity. |
| Strouhal number | f·h ÷ U, the dimensionless shedding frequency; about 0.2 for bluff bodies. |
| Side force | Force across the tunnel (+z), and its coefficient Cs; exists only in 3D. |
| Visual-only part | A shape that is drawn but not simulated — the flow passes through it (e.g. a car's wheels in 2D). |
| Vortex shedding | Vortices peeling off alternately from a bluff body, making the forces oscillate. |
| Vorticity | Local spin of the fluid; high in shear layers and vortex cores. |
| Voxel | A 3D grid cell; imported meshes are voxelised into solid and fluid cells. |
| Wake | Slow, often recirculating fluid behind a body; its size tracks the drag. |