lbm-gpu: the lattice Boltzmann step on the GPU, checked against the CPU

A new L7 crate: the CPU scheme's collision (TRT with Guo forcing), the
per-link streaming rules (bounce-back with Ladd's term, slip reflection,
open placeholders), the Zou–He boundaries and the momentum exchange per
force group as wgpu compute shaders, stepping the flow fieldcraft_lbm's
Flow prepared, through its Backend trait: populations stay on the device,
a chunk of steps is one submission, and only frames, forces and the
stability check come back. Populations are stored as deviations from
their weights, which keeps single precision honest: the verification
cases (Poiseuille with Λ = 3/16, Couette with wall forces, Taylor–Green,
a sphere's drag, a Zou–He channel) agree with the CPU to 2–5e-6 in
velocity, 1e-6 in density and 5e-5 in force, with those tolerances stated
in the tests. The rules are applied one thread per link rather than in a
per-cell loop, which lavapipe's JIT miscompiles (and which diverges on
real GPUs anyway). Native only for now; the browser registers nothing.

Part of #529.
This commit is contained in:
Christian Svensson authored and Irakli Kourtis committed 2026-10-17 07:23:40 -04:00
1 parent 944a54c76b
commit b123f31d47
10 files changed
+1270

No files matched your search

+3
View File
@@ -57,6 +57,7 @@ pub const TABLE: &[(&str, Class)] = &[
("io", Class::Layer(5)),
("engine", Class::Layer(6)),
("gpu", Class::Layer(7)),
("lbm-gpu", Class::Layer(7)),
("ui-egui", Class::Layer(7)),
("mcp", Class::Layer(7)),
("testkit", Class::Testkit),
@@ -73,6 +74,8 @@ pub const INTRA_LAYER_ORDER: &[&[&str]] = &[
&["gpu", "ui-egui"],
// The MCP server's headless screenshots draw with them too.
&["gpu", "mcp"],
// The lattice Boltzmann GPU backend opens its device with the GPU crate's adapter policy.
&["gpu", "lbm-gpu"],
];
fn intra_layer_allowed(from: &str, to: &str) -> bool {