# ceschmiedel/cfd_ architecture

> Architecture diagram of the GitHub repository ceschmiedel/cfd_, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-25). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/ceschmiedel/cfd_
- Repository: https://github.com/ceschmiedel/cfd_

## Overview

CFD2026 is a browser-based 3D wind-tunnel simulator. The user selects a resolution and backend, loads a model, and the app parses and prepares its geometry, voxelizes it into the tunnel, and advances a D3Q19 Lattice-Boltzmann simulation on the GPU. Results drive the visualization and, after sufficient flow-through and samples, a printable run report. The graph preserves both WebGPU and WebGL2 paths and their shared physics-generation layer. The README documents the main workflow and capabilities; several connections are based on that documentation because the browser entry point and geometry-preparation sources were not sampled.

Main entry points: [`index.html`](https://github.com/ceschmiedel/cfd_/blob/master/index.html) (Browser interface), [`src/core/emit/ir.js`](https://github.com/ceschmiedel/cfd_/blob/master/src/core/emit/ir.js) (Shared physics IR), [`src/backend/webgpu/solver.js`](https://github.com/ceschmiedel/cfd_/blob/master/src/backend/webgpu/solver.js) (WebGPU solver), [`src/backend/webgl2/solver.js`](https://github.com/ceschmiedel/cfd_/blob/master/src/backend/webgl2/solver.js) (WebGL2 solver)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_app["Browser app"]
  node_app["Browser interface<br/>[index.html]"]
  node_caps["Backend and presets<br/>[caps.js]"]
end

subgraph group_geometry["Geometry pipeline"]
  node_parse["Mesh parsing<br/>[parse.js]"]
  node_prepare["Geometry preparation<br/>[prepare.js]"]
  node_voxel["Tunnel voxelization<br/>[voxel.js]"]
end

subgraph group_simulation["Simulation"]
  node_units["Physical units<br/>[units.js]"]
  node_lattice["Lattice and collision<br/>[lattice.js]"]
  node_forces["Force calculation<br/>[forces.js]"]
  node_ir["Shared physics IR<br/>[ir.js]"]
  node_wgsl["WGSL generation<br/>[wgsl.js]"]
  node_glsl["GLSL generation<br/>[glsl.js]"]
  node_webgpu["WebGPU solver<br/>[solver.js]"]
  node_webgl["WebGL2 solver<br/>[solver.js]"]
end

subgraph group_output["Visualization and reporting"]
  node_renderer["Scene renderer<br/>[renderer.js]"]
  node_smoke["Volumetric smoke<br/>[fumaca.js]"]
  node_glrenderer["WebGL2 renderer<br/>[renderer.js]"]
  node_report["Run report<br/>[relatorio.js]"]
end

node_user(("User"))
node_gpu(("Browser GPU"))

node_user -->|"selects and loads"| node_app
node_app -->|"probes capabilities"| node_caps
node_app -->|"loads model"| node_parse
node_parse -->|"parsed mesh"| node_prepare
node_prepare -->|"prepared geometry"| node_voxel
node_app -->|"sets run parameters"| node_units
node_app -->|"provides tunnel geometry"| node_voxel
node_app -->|"dispatches selected solver"| node_webgpu
node_app -.->|"dispatches selected solver"| node_webgl
node_units -->|"configures run"| node_webgpu
node_units -.->|"configures run"| node_webgl
node_lattice -->|"supplies physics"| node_ir
node_forces -->|"supplies force logic"| node_ir
node_ir -->|"generates dialect"| node_wgsl
node_ir -->|"generates dialect"| node_glsl
node_webgpu -->|"requests shaders"| node_wgsl
node_webgl -.->|"requests shaders"| node_glsl
node_webgpu -->|"runs compute"| node_gpu
node_webgl -.->|"runs shader passes"| node_gpu
node_app -->|"renders simulation"| node_renderer
node_app -.->|"renders WebGL2"| node_glrenderer
node_renderer -->|"renders smoke"| node_smoke
node_app -->|"generates run report"| node_report

click node_app "https://github.com/ceschmiedel/cfd_/blob/master/index.html"
click node_caps "https://github.com/ceschmiedel/cfd_/blob/master/src/backend/caps.js"
click node_parse "https://github.com/ceschmiedel/cfd_/blob/master/src/geom/parse.js"
click node_prepare "https://github.com/ceschmiedel/cfd_/blob/master/src/geom/prepare.js"
click node_voxel "https://github.com/ceschmiedel/cfd_/blob/master/src/geom/voxel.js"
click node_units "https://github.com/ceschmiedel/cfd_/blob/master/src/core/units.js"
click node_lattice "https://github.com/ceschmiedel/cfd_/blob/master/src/core/lattice.js"
click node_forces "https://github.com/ceschmiedel/cfd_/blob/master/src/core/forces.js"
click node_ir "https://github.com/ceschmiedel/cfd_/blob/master/src/core/emit/ir.js"
click node_wgsl "https://github.com/ceschmiedel/cfd_/blob/master/src/core/emit/wgsl.js"
click node_glsl "https://github.com/ceschmiedel/cfd_/blob/master/src/core/emit/glsl.js"
click node_webgpu "https://github.com/ceschmiedel/cfd_/blob/master/src/backend/webgpu/solver.js"
click node_webgl "https://github.com/ceschmiedel/cfd_/blob/master/src/backend/webgl2/solver.js"
click node_renderer "https://github.com/ceschmiedel/cfd_/blob/master/src/render/renderer.js"
click node_smoke "https://github.com/ceschmiedel/cfd_/blob/master/src/render/fumaca.js"
click node_glrenderer "https://github.com/ceschmiedel/cfd_/blob/master/src/render/webgl2/renderer.js"
click node_report "https://github.com/ceschmiedel/cfd_/blob/master/src/relatorio.js"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_app,node_caps,node_user,node_gpu toneBlue
class node_parse,node_prepare,node_voxel toneAmber
class node_units,node_lattice,node_forces,node_ir,node_wgsl,node_glsl,node_webgpu,node_webgl toneMint
class node_renderer,node_smoke,node_glrenderer,node_report toneRose
```

## Components

### Browser app

- [Browser interface](https://github.com/ceschmiedel/cfd_/blob/master/index.html): `index.html`
- [Backend and presets](https://github.com/ceschmiedel/cfd_/blob/master/src/backend/caps.js): `src/backend/caps.js`

### Geometry pipeline

- [Mesh parsing](https://github.com/ceschmiedel/cfd_/blob/master/src/geom/parse.js): `src/geom/parse.js`
- [Geometry preparation](https://github.com/ceschmiedel/cfd_/blob/master/src/geom/prepare.js): `src/geom/prepare.js`
- [Tunnel voxelization](https://github.com/ceschmiedel/cfd_/blob/master/src/geom/voxel.js): `src/geom/voxel.js`

### Simulation

- [Physical units](https://github.com/ceschmiedel/cfd_/blob/master/src/core/units.js): `src/core/units.js`
- [Lattice and collision](https://github.com/ceschmiedel/cfd_/blob/master/src/core/lattice.js): `src/core/lattice.js`
- [Force calculation](https://github.com/ceschmiedel/cfd_/blob/master/src/core/forces.js): `src/core/forces.js`
- [Shared physics IR](https://github.com/ceschmiedel/cfd_/blob/master/src/core/emit/ir.js): `src/core/emit/ir.js`
- [WGSL generation](https://github.com/ceschmiedel/cfd_/blob/master/src/core/emit/wgsl.js): `src/core/emit/wgsl.js`
- [GLSL generation](https://github.com/ceschmiedel/cfd_/blob/master/src/core/emit/glsl.js): `src/core/emit/glsl.js`
- [WebGPU solver](https://github.com/ceschmiedel/cfd_/blob/master/src/backend/webgpu/solver.js): `src/backend/webgpu/solver.js`
- [WebGL2 solver](https://github.com/ceschmiedel/cfd_/blob/master/src/backend/webgl2/solver.js): `src/backend/webgl2/solver.js`

### Visualization and reporting

- [Scene renderer](https://github.com/ceschmiedel/cfd_/blob/master/src/render/renderer.js): `src/render/renderer.js`
- [Volumetric smoke](https://github.com/ceschmiedel/cfd_/blob/master/src/render/fumaca.js): `src/render/fumaca.js`
- [WebGL2 renderer](https://github.com/ceschmiedel/cfd_/blob/master/src/render/webgl2/renderer.js): `src/render/webgl2/renderer.js`
- [Run report](https://github.com/ceschmiedel/cfd_/blob/master/src/relatorio.js): `src/relatorio.js`

### Other components

- **User**
- **Browser GPU**

## Connections

- User → Browser interface: selects and loads
- Browser interface → Backend and presets: probes capabilities
- Browser interface → Mesh parsing: loads model
- Mesh parsing → Geometry preparation: parsed mesh
- Geometry preparation → Tunnel voxelization: prepared geometry
- Browser interface → Physical units: sets run parameters
- Browser interface → Tunnel voxelization: provides tunnel geometry
- Browser interface → WebGPU solver: dispatches selected solver
- Browser interface → WebGL2 solver: dispatches selected solver
- Physical units → WebGPU solver: configures run
- Physical units → WebGL2 solver: configures run
- Lattice and collision → Shared physics IR: supplies physics
- Force calculation → Shared physics IR: supplies force logic
- Shared physics IR → WGSL generation: generates dialect
- Shared physics IR → GLSL generation: generates dialect
- WebGPU solver → WGSL generation: requests shaders
- WebGL2 solver → GLSL generation: requests shaders
- WebGPU solver → Browser GPU: runs compute
- WebGL2 solver → Browser GPU: runs shader passes
- Browser interface → Scene renderer: renders simulation
- Browser interface → WebGL2 renderer: renders WebGL2
- Scene renderer → Volumetric smoke: renders smoke
- Browser interface → Run report: generates run report
