Results
These are example results from GitHub-hosted runners, refreshed on every release. Wall-clock times vary between runs, so treat absolute times as indicative and compare solvers by their relative cost. For numbers that reflect your own hardware, run the benchmark yourself.
Faster does not mean better. So far, Mosaic’s setups are kept simple so that many solvers can run them. That favors solvers built for exactly these problems and hides what general-purpose libraries offer, like support for complex geometries, boundary conditions, and turbulence schemes. The table shows how each solver does on the Mosaic setups, not which solver is better.
The integrations may not make the best use of each library. They’re written by Mosaic team or a contributor, and the effort column and the modified-setup notes record what was needed to do so. If you know a solver well and can improve its configuration, please contribute!
How to read the results
Rows are ordered by checks passed, then by forward cost. Mosaic does not combine the columns into a single score.
| Column | Meaning |
|---|---|
| Forward, Gradient, Optimization | Whether the setup’s experiments in that suite met their pass criteria. Hover for the numbers. k of n run: only some of the experiments behind the check ran. |
| Forward cost, VJP cost | Wall-clock time at the size N in the group’s header, the largest that every solver in the group completed, and its multiple of the fastest. A solver that completed fewer than half of the sizes is left out, and the cell says where it stopped. |
| Cost to 10% error | On the Kolmogorov flow, the wall time per simulated time unit a solver needs to stay within 10% relative error of the converged truth at t = 4, interpolated between the grids it ran. ≤ means the coarsest grid already got there. |
| Time to plateau | How far into the optimization run the loss had made 95% of its improvement, on a log scale, and its multiple of the fastest. Results recorded before the harness kept this time estimate it as the run’s wall time times the share of its iterations run by then, which includes startup and compilation pro rata. Where a run’s iteration counts were not all recorded, the column counts iterations instead. |
| Peak memory | Of the VJP pass (the forward pass for forward-only solvers): device memory on a GPU, container memory on a CPU. |
| Effort | The most invasive intervention the solver needs on the setup, from L0 (nothing beyond documented options) to L3 (changes to the solver itself). See effort levels. |
A solver marked modified setup runs a substitute for part of the setup, such as a different outflow condition, so its checks hold for the modified setup. The notes below the table say what it changes and how that affects the results.
| State | Meaning |
|---|---|
| ✓ Pass | Every experiment met its criteria. |
| ! Flagged | An experiment ran but missed its criteria. |
| ✗ Fail | An experiment errored or produced no valid result. |
| ⊘ Blocked | Excluded for a recorded reason, such as an instability or an upstream bug, which the cell names. |
| — Not supported | The method cannot express the experiment, e.g. a forward-only solver has no gradient. |
| · Not run | Not run in this campaign. |
| Setup | Forward | Gradient | Optimization |
|---|---|---|---|
| Steady conduction in a slab | agreement, baseline, physical_laws, source_baseline, source_linearity |
fd_check, param_sweep, source_fd_check, source_width_sweep |
conductivity_recovery_bfgs |
| Linear-elastic cantilever | agreement, baseline, physical_laws |
fd_check, param_sweep |
topopt |
| Periodic box | agreement, baseline, physical_laws, tgv_nu_sweep |
fd_check, analytic_check, analytic_check_nu, param_sweep |
— |
| Channel flow past a cylinder | cylinder |
— | drag_opt |
| Forced Kolmogorov flow | kolmogorov_laminar, kolmogorov |
chain_fd_check |
— |
| Triply periodic box | agreement, baseline, physical_laws |
fd_check |
recovery |
Some criteria are absolute, such as an error bound against an analytic solution, an observed order of convergence or a minimum agreement with finite differences. Others compare a solver with its peers on the same experiment, for example an error more than three times their median, so a flag on such a criterion marks an outlier that may still be accurate enough for a given task. The thresholds are provisional and will be refined with the solver maintainers. They live next to each experiment in mosaic/benchmarks/problems/<problem>/config.py.
Checks by setup
Steady conduction in a slab
Heat transfer| Solver | Forward | Gradient | Optimization | Forward cost | VJP cost | Time to plateau | Peak memory | Effort |
|---|---|---|---|---|---|---|---|---|
| GPU solversForward and VJP, multiples of the fastest GPU solver | ||||||||
| JAX-FEM | Pass | Pass | Pass | — | — | — | — | L0 |
| torch-fem | Pass | Pass | Pass | — | — | — | — | L0 |
| CPU solversForward and VJP at N=1024, multiples of the fastest CPU solver | ||||||||
| FEniCS | Pass | Pass | Pass | 14.3 sfastest | 30.5 sfastest | 2.1 minfastest | 4.67 GiB | L3 |
| Firedrake | Pass | Pass | Pass | — | — | — | — | L0 |
| deal.II | Pass | Not supported | Not supported | 20.1 s1.4× | — | — | 1.87 GiB | L0 |
Flags and exclusions (12)
- Firedrake on
cost/spatial_cost: not run - Firedrake on
cost/temporal_cost: not run - Firedrake on
cost/vjp_cost/by_N: not run - Firedrake on
cost/vjp_cost/by_steps: not run - JAX-FEM on
cost/spatial_cost: not run - JAX-FEM on
cost/temporal_cost: not run - JAX-FEM on
cost/vjp_cost/by_N: not run - JAX-FEM on
cost/vjp_cost/by_steps: not run - torch-fem on
cost/spatial_cost: not run - torch-fem on
cost/temporal_cost: not run - torch-fem on
cost/vjp_cost/by_N: not run - torch-fem on
cost/vjp_cost/by_steps: not run
Not supported (1 solver)
- deal.II, 7 experiments. The deal.II thermal tesseract is forward-only. It exposes no AD path (no VJP endpoint, no differentiable inputs), so cost/vjp and gradient experiments are categorically out of scope.; The deal.II thermal tesseract exposes no AD path, and conductivity recovery (gradient-based ρ updates that minimize the misfit to a target temperature field) requires a differentiable identification-error output.
Linear-elastic cantilever
Structural mechanics| Solver | Forward | Gradient | Optimization | Forward cost | VJP cost | Time to plateau | Peak memory | Effort |
|---|---|---|---|---|---|---|---|---|
| GPU solversForward and VJP, multiples of the fastest GPU solver | ||||||||
| JAX-FEM | Pass | Pass | Pass | — | — | — | — | L0 |
| torch-fem | Pass | Pass | Pass | — | — | — | — | L0 |
| CPU solversForward and VJP at N=128, multiples of the fastest CPU solver | ||||||||
| FEniCS | Pass | Pass | Pass | 3.05 s2.0× | 6.02 sfastest | 6.1 minfastest | 1.07 GiB | L0 |
| Firedrake | Pass | Pass | Pass | — | — | — | — | L0 |
| TopOpt.jlmodified setup | Pass | Pass | Pass | — | — | — | — | L0 |
| deal.II | Pass | Not supported | Not supported | 1.51 sfastest | — | — | 763 MiB | L0 |
Modified setups (1)
These solvers run a substitute for part of the setup, so their checks hold for the modified setup.
- TopOpt.jl: Applies the cantilever load as nodal forces. Effect: None: on the uniform mesh the nodal forces equal the integrated traction.
Flags and exclusions (16)
- Firedrake on
cost/spatial_cost: not run - Firedrake on
cost/temporal_cost: not run - Firedrake on
cost/vjp_cost/by_N: not run - Firedrake on
cost/vjp_cost/by_steps: not run - JAX-FEM on
cost/spatial_cost: not run - JAX-FEM on
cost/temporal_cost: not run - JAX-FEM on
cost/vjp_cost/by_N: not run - JAX-FEM on
cost/vjp_cost/by_steps: not run - TopOpt.jl on
cost/spatial_cost: not run - TopOpt.jl on
cost/temporal_cost: not run - TopOpt.jl on
cost/vjp_cost/by_N: not run - TopOpt.jl on
cost/vjp_cost/by_steps: not run - torch-fem on
cost/spatial_cost: not run - torch-fem on
cost/temporal_cost: not run - torch-fem on
cost/vjp_cost/by_N: not run - torch-fem on
cost/vjp_cost/by_steps: not run
Not supported (1 solver)
- deal.II, 5 experiments. The deal.II structural tesseract is forward-only. It exposes no AD path (no VJP endpoint, no differentiable inputs), so cost/vjp and gradient experiments are categorically out of scope.; The deal.II structural tesseract has no AD path, and topology optimization (compliance gradient-based ρ updates) requires a differentiable compliance output.
Periodic box
Navier–Stokes (2D)| Solver | Forward | Gradient | Forward cost | VJP cost | Peak memory | Effort |
|---|---|---|---|---|---|---|
| GPU solversForward and VJP at N=256, multiples of the fastest GPU solver, measured on Tesla T4 | ||||||
| jax-cfd | Pass | Pass3 of 4 run | 40.1 ms1.2× | 85.6 ms1.1× | 512 MiB | L0 |
| Warp-NS | Pass | Pass3 of 4 run | 99.8 ms2.9× | 407 ms5.0× | 4 MiB | L2 |
| XLBmodified setup | Pass | Pass3 of 4 run | 266 ms7.7× | 1.49 s18× | 8 GiB | L2 |
| INS.jl | Pass | Pass3 of 4 run | 280 ms8.1× | 986 ms12× | 32 MiB | L0 |
| PhiFlow | Pass | Pass3 of 4 run | 22 s640× | 68.3 s840× | 1.09 GiB | L3 |
| Exponax | Flagged | Pass3 of 4 run | 34.4 msfastest | 81.3 msfastest | 256 MiB | L2 |
| PICT | Flagged | Pass | 4.99 s145× | 10.5 s129× | 4.97 GiB | L0 |
| CPU solversForward and VJP at N=256, multiples of the fastest CPU solver | ||||||
| OpenFOAM | Flagged | Not supported | 7.72 sfastest | — | 528 MiB | L0 |
Solvers differ in how general they are. Exponax and jax-cfd do not run Channel flow past a cylinder. Exponax, INS.jl, OpenFOAM, PhiFlow, Warp-NS, XLB and jax-cfd do not run Forced Kolmogorov flow.
Modified setups (1)
These solvers run a substitute for part of the setup, so their checks hold for the modified setup.
- XLB: Sub-steps each step to bound the Mach number. Effect: LBM ties the time step to the grid through the lattice Mach number, so XLB runs k times the prescribed number of steps (k = 9 at N = 256 on the 2-D box), and its cost includes them. Without sub-stepping the Taylor-Green case ran at Ma of about 0.88, with errors 84 to 114x the peer median.
Flags and exclusions (9)
- jax-cfd on
gradient/analytic_check_nu: not run - Warp-NS on
gradient/analytic_check_nu: not run - XLB on
gradient/analytic_check_nu: not run - INS.jl on
gradient/analytic_check_nu: not run - PhiFlow on
gradient/analytic_check_nu: not run - Exponax on
forward/baseline: flagged. error converges at order -1.46 in N, below min_order=0.8 (explained: the Taylor–Green vortex is a single Fourier mode, which a spectral method represents exactly on every grid, so Exponax's error is float32 round-off from the first step. Round-off grows with the number of grid points and steps rather than shrinking with the grid spacing, so no positive order can be observed) - Exponax on
gradient/analytic_check_nu: not run - PICT on
forward/baseline: flagged. error converges at order 0.35 in N, below min_order=0.8 (explained: PICT runs PISO with its default two pressure correctors, and its momentum predictor carries no pressure gradient. The splitting error this leaves scales with ν·dt/dx², which grows as the grid is refined at fixed CFL, so the error levels off on the finest grids and the observed order drops. More correctors remove the floor at a multiple of the wall time and reverse-mode memory) - OpenFOAM on
forward/tgv_nu_sweep: flagged. error 0.00645 at sweep=0.0001 is 4.2× peer median (0.00154); threshold k=3.0 (explained: OpenFOAM stores velocity at cell centres and makes only the face fluxes divergence-free. In the Taylor–Green vortex, advection is a gradient at twice the vortex's wavenumber, which the pressure cancels exactly. Most of OpenFOAM's error is a compressive component at that wavenumber in the cell-centred velocity. The staggered and spectral solvers have none of it, the other solvers at most a tenth of it. It is second order in the grid spacing, grows with the simulated time and the vortex's amplitude, and changes little with the timestep. It shrinks as the viscosity grows, so it stands out only at the lowest viscosities)
Not supported (1 solver)
- OpenFOAM, 11 experiments. OpenFOAM has no VJP to benchmark; OpenFOAM is non-differentiable (C++, no AD path); DAFoam/OpenFOAM-AD exist but are not deployed in this tesseract
Channel flow past a cylinder
Navier–Stokes (2D)| Solver | Forward | Optimization | Effort |
|---|---|---|---|
| GPU solvers | |||
| INS.jl | Pass | Pass | L2 |
| PhiFlow | Pass | Pass | L2 |
| PICTmodified setup | Pass | Pass | L2 |
| Warp-NS | Pass | Pass | L2 |
| XLBmodified setup | Pass | Pass | L0 |
| Exponax | Not supported | Not supported | L0 |
| jax-cfd | Not supported | Not supported | L0 |
| CPU solvers | |||
| OpenFOAM | Pass | Not supported | L0 |
Solvers differ in how general they are. Exponax, INS.jl, OpenFOAM, PhiFlow, Warp-NS, XLB and jax-cfd do not run Forced Kolmogorov flow.
Modified setups (2)
These solvers run a substitute for part of the setup, so their checks hold for the modified setup.
- PICT: Replaces the pressure outlet with advective outflow. Effect: Partly measured. In OpenFOAM, an advective velocity outlet with p = 0 leaves Cd, Cl and pressure drop unchanged to six digits, as expected for a steady flow; the missing pressure outlet could not be reproduced there. Its share of PICT's 3% Cd excess (#239) is unmeasured.
- XLB: Sub-steps each step to bound the Mach number. Effect: LBM ties the time step to the grid through the lattice Mach number, so XLB runs k times the prescribed number of steps (k = 9 at N = 256 on the 2-D box), and its cost includes them. Without sub-stepping the Taylor-Green case ran at Ma of about 0.88, with errors 84 to 114x the peer median.
Not supported (3 solvers)
- OpenFOAM, 1 experiment. OpenFOAM is a non-differentiable, forward-only solver
- Exponax, 2 experiments. a Fourier pseudo-spectral method represents only periodic fields, so it cannot express a channel with walls, an inflow and an outflow
- jax-cfd, 2 experiments. jax-cfd 0.2.1 cannot express the channel. Its advection raises NotImplementedError for any inflow (only no-penetration and periodic boundaries are supported), it pads a zero-gradient boundary only for cell-centered fields, so the outlet's face-centered u_x cannot have one, its boundary values are scalars, so the inlet cannot carry a profile, and it has no obstacles
Forced Kolmogorov flow
Navier–Stokes (2D)| Solver | Forward | Gradient | Cost to 10% error | Effort |
|---|---|---|---|---|
| GPU solversMultiples of the fastest GPU solver | ||||
| PICT | Pass | Pass | 16.2 sfastest | L0 |
| Exponax | Not run | Not run | — | L3 |
| INS.jl | Not run | Not run | — | L0 |
| jax-cfd | Not run | Not run | — | L2 |
| PhiFlow | Not run | Not run | — | L3 |
| Warp-NS | Not run | Unstable | — | L2 |
| XLBmodified setup | Not run | Not run | — | L2 |
| CPU solvers | ||||
| OpenFOAM | Not implemented | Not supported | — | L0 |
Solvers differ in how general they are. Exponax and jax-cfd do not run Channel flow past a cylinder.
Modified setups (1)
These solvers run a substitute for part of the setup, so their checks hold for the modified setup.
- XLB: Sub-steps each step to bound the Mach number. Effect: LBM ties the time step to the grid through the lattice Mach number, so XLB runs k times the prescribed number of steps (k = 9 at N = 256 on the 2-D box), and its cost includes them. Without sub-stepping the Taylor-Green case ran at Ma of about 0.88, with errors 84 to 114x the peer median.
Flags and exclusions (20)
- Exponax on
forward/kolmogorov: not run - Exponax on
forward/kolmogorov_laminar: not run - Exponax on
gradient/chain_fd_check: not run - INS.jl on
forward/kolmogorov: not run - INS.jl on
forward/kolmogorov_laminar: not run - INS.jl on
gradient/chain_fd_check: not run - jax-cfd on
forward/kolmogorov: not run - jax-cfd on
forward/kolmogorov_laminar: not run - jax-cfd on
gradient/chain_fd_check: not run - OpenFOAM on
forward/kolmogorov: not implemented. this tesseract runs icoFoam, which has no momentum source term, so it cannot apply the body force or the drag. OpenFOAM's foamRun incompressibleFluid solver supports both through an fvModel, but this tesseract does not use it - OpenFOAM on
forward/kolmogorov_laminar: not implemented. this tesseract runs icoFoam, which has no momentum source term, so it cannot apply the body force or the drag. OpenFOAM's foamRun incompressibleFluid solver supports both through an fvModel, but this tesseract does not use it - PhiFlow on
forward/kolmogorov: not run - PhiFlow on
forward/kolmogorov_laminar: not run - PhiFlow on
gradient/chain_fd_check: not run - Warp-NS on
forward/kolmogorov: not run - Warp-NS on
forward/kolmogorov_laminar: not run - Warp-NS on
gradient/chain_fd_check: unstable. the solver advances with explicit Euler and central differences for advection, which is linearly unstable at the timestep of the chain (see forward/kolmogorov). Over the chain's calls the unstable modes grow, so they dominate both the gradient and the finite differences, which then disagree at every ε a float32 run resolves. Where they grow fast enough, the chain from the ground-truth state diverges - XLB on
forward/kolmogorov: not run - XLB on
forward/kolmogorov_laminar: not run - XLB on
gradient/chain_fd_check: not run
Not supported (1 solver)
- OpenFOAM, 1 experiment. OpenFOAM is non-differentiable (C++, no AD path); DAFoam/OpenFOAM-AD exist but are not deployed in this tesseract
Triply periodic box
Navier–Stokes (3D)| Solver | Forward | Gradient | Optimization | Forward cost | VJP cost | Peak memory | Effort |
|---|---|---|---|---|---|---|---|
| GPU solversForward and VJP at N=64, multiples of the fastest GPU solver, measured on Tesla T4 | |||||||
| PICT | Pass | Pass | Pass | 1.28 sfastest | 3.31 sfastest | 14 GiB | L0 |
| Exponax | Pass | Pass | Pass | — | — | — | L0 |
| INS.jl | Pass | Pass | Pass | — | — | — | L0 |
| jax-cfd | Pass | Pass | Pass | — | — | — | L0 |
| PhiFlow | Pass | Pass | Pass | — | — | — | L3 |
| Warp-NS | Pass1 of 5 run | Pass | Pass | — | — | — | L2 |
| XLBmodified setup | Pass | Pass | Pass | — | — | — | L2 |
| CPU solversForward and VJP, multiples of the fastest CPU solver | |||||||
| OpenFOAM | Pass1 of 5 run | Not supported | Not supported | — | — | — | L0 |
Solvers differ in how general they are. Exponax and jax-cfd do not run Channel flow past a cylinder. Exponax, INS.jl, OpenFOAM, PhiFlow, Warp-NS, XLB and jax-cfd do not run Forced Kolmogorov flow.
Modified setups (1)
These solvers run a substitute for part of the setup, so their checks hold for the modified setup.
- XLB: Sub-steps each step to bound the Mach number. Effect: LBM ties the time step to the grid through the lattice Mach number, so XLB runs k times the prescribed number of steps (k = 9 at N = 256 on the 2-D box), and its cost includes them. Without sub-stepping the Taylor-Green case ran at Ma of about 0.88, with errors 84 to 114x the peer median.
Flags and exclusions (41)
- PICT on
cost/vjp_cost/by_steps: failed. container_died: ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response')) - Exponax on
cost/spatial_cost: not run - Exponax on
cost/temporal_cost: not run - Exponax on
cost/vjp_cost/by_N: not run - Exponax on
cost/vjp_cost/by_steps: not run - Exponax on
gradient/horizon_sweep_limits: not run - INS.jl on
cost/spatial_cost: not run - INS.jl on
cost/temporal_cost: not run - INS.jl on
cost/vjp_cost/by_N: not run - INS.jl on
cost/vjp_cost/by_steps: not run - INS.jl on
gradient/horizon_sweep_limits: not run - jax-cfd on
cost/spatial_cost: not run - jax-cfd on
cost/temporal_cost: not run - jax-cfd on
cost/vjp_cost/by_N: not run - jax-cfd on
cost/vjp_cost/by_steps: not run - jax-cfd on
gradient/horizon_sweep_limits: not run - PhiFlow on
cost/spatial_cost: not run - PhiFlow on
cost/temporal_cost: not run - PhiFlow on
cost/vjp_cost/by_N: not run - PhiFlow on
cost/vjp_cost/by_steps: not run - PhiFlow on
gradient/horizon_sweep_limits: not run - Warp-NS on
forward/agreement: not run - Warp-NS on
forward/physical_laws/vs_N: not run - Warp-NS on
forward/physical_laws/vs_nu: not run - Warp-NS on
forward/physical_laws/vs_steps: not run - Warp-NS on
cost/spatial_cost: not run - Warp-NS on
cost/temporal_cost: not run - Warp-NS on
cost/vjp_cost/by_N: not run - Warp-NS on
cost/vjp_cost/by_steps: not run - Warp-NS on
gradient/horizon_sweep_limits: not run - XLB on
cost/spatial_cost: not run - XLB on
cost/temporal_cost: not run - XLB on
cost/vjp_cost/by_N: not run - XLB on
cost/vjp_cost/by_steps: not run - XLB on
gradient/horizon_sweep_limits: not run - OpenFOAM on
forward/agreement: not run - OpenFOAM on
forward/physical_laws/vs_N: not run - OpenFOAM on
forward/physical_laws/vs_nu: not run - OpenFOAM on
forward/physical_laws/vs_steps: not run - OpenFOAM on
cost/spatial_cost: not run - OpenFOAM on
cost/temporal_cost: not run
Resource limits (2)
Sweeps a solver completed only up to some size or rollout length. It ran out of memory or time or, in sweeps that look for the limit, failed past the last value it completed. Unless that happened at the first value, the experiment counts as ok, and the limit shows how far the solver goes on this hardware.
- PICT on
cost/vjp_cost/by_N, from N=96 - PICT on
gradient/horizon_sweep_limits, from steps=10240
Not supported (1 solver)
- OpenFOAM, 9 experiments. standard icoFoam has no VJP to benchmark; standard icoFoam is non-differentiable (C++, no AD path); DAFoam/OpenFOAM-AD exist but are not deployed in this tesseract; standard icoFoam is a non-differentiable, forward-only solver
Download the data
The full result tree of every release, with the metrics, fields and plot specs behind these pages, is attached to its GitHub release as mosaic-results-<version>.zip, for your own analyses.
Experiment explorer
Every experiment across all setups. Search or filter, then click a card to see its plots.

H Initial conditions 1 plot
Initial conditions overview

H Forward 1 plot
Agreement between solvers
Steady conduction in a slab, forward
Thermal compliance \(C\) vs uniform element density \(\rho_0\) at fixed \(N\); compares solvers on a log scale.

H Forward 1 plot
Agreement with the reference
Steady conduction in a slab, forward
Thermal compliance \(C\) vs mesh resolution \(N\) with random density; compares the solvers across refinements.

H Forward 1 plot
Conservation and decay laws
Steady conduction in a slab, forward
Thermal compliance \(C\) vs total heat flux \(Q_\mathrm{total}\) at fixed \(N\) and \(\rho_0\) with a hot-spot BC; shown on log-log axes.

H Forward 1 plot
Agreement with the reference (heat source)
Steady conduction in a slab, forward
Thermal compliance \(C\) vs mesh resolution \(N\) with a Gaussian source field; compares solvers across refinements.

H Forward 1 plot
Linearity in the heat source
Steady conduction in a slab, forward
Thermal compliance \(C\) vs source amplitude at fixed mesh; compares solvers on log-log axes.

H Cost 1 plot
Cost overview

H Gradient 1 plot
Gradient against finite differences
Steady conduction in a slab, gradient
FD gradient error vs step size \(\varepsilon\) (U-curves), AD/FD direction cosine, and gradient magnitude field panels.

H Gradient 1 plot
Gradient accuracy across the control parameter
Steady conduction in a slab, gradient
Gradient norm, best-\(\varepsilon\) FD error, AD/FD direction cosine, and U-curves vs element density \(\rho_0\).

H Gradient 1 plot
Gradient with respect to the heat source
Steady conduction in a slab, gradient
FD gradient error vs \(\varepsilon\), AD/FD direction cosine, and gradient field panels for d(identification_error)/d(source).

H Gradient 1 plot
Heat-source gradient across source width
Steady conduction in a slab, gradient
Gradient norm, best-\(\varepsilon\) FD error, AD/FD direction cosine, and U-curves vs source width \(\sigma\).

H Optimization 1 plot
Conductivity recovery (L-BFGS)
Steady conduction in a slab, optimization
Optimisation traces (loss vs iteration) and recovered conductivity fields vs the two-Gaussian ground truth, using L-BFGS.

S Initial conditions 1 plot
Initial conditions overview

S Forward 1 plot
Agreement between solvers
Linear-elastic cantilever, forward
Structural compliance \(C = \mathbf{F}^\top \mathbf{u}\) vs density \(\rho_0\) at fixed mesh, sweeping uniform density to span the SIMP stiffness regime.

S Forward 1 plot
Agreement with the reference
Linear-elastic cantilever, forward
Structural compliance \(C = \mathbf{F}^\top \mathbf{u}\) vs mesh resolution \(N\) for each solver, uniform density \(\rho_0=0.5\), full-face downward load.

S Forward 1 plot
Conservation and decay laws
Linear-elastic cantilever, forward
Diagnostic functionals (compliance, total displacement) vs total load \(F_\mathrm{total}\), validating linearity of the SIMP response.

S Cost 1 plot
Cost overview

S Gradient 1 plot
Gradient against finite differences
Linear-elastic cantilever, gradient
U-curves of finite-difference gradient error vs perturbation size \(\varepsilon\) with subspace cosine, validating VJP correctness on a random density.

S Gradient 1 plot
Gradient accuracy across the control parameter
Linear-elastic cantilever, gradient
Gradient norm, best-\(\varepsilon\) FD error, direction cosine, and U-curves vs uniform density \(\rho_0\).

S Optimization 8 plots
Topology optimization
Linear-elastic cantilever, optimization
SIMP topology optimization on a \(16\times2\times8\) cantilever beam with Adam (lr=0.05): compliance \(C = \mathbf{F}^\top \mathbf{u}\) and density field evolution under a 50% volume-fraction constraint.

F2 Initial conditions 1 plot
Initial conditions overview

F2 Forward 1 plot
Agreement with the reference
Periodic box, forward
Relative error vs grid resolution \(N\) against the analytic TGV solution at \(t=1.28\), refining space and time together at a fixed CFL number. The legend gives each solver’s observed order of accuracy \(p\).

F2 Forward 1 plot
Flow past a cylinder against the DFG reference
Channel flow past a cylinder, forward
Steady flow past a cylinder in a channel (Schäfer–Turek DFG 2D-1, Re = 20) at 10 and 20 cells per diameter. Each solver’s drag coefficient at 20 is scored against the reference Cd = 5.5795. The pressure difference across the cylinder (reference 0.1175) and the lift coefficient are also reported. The vorticity fields are for visual comparison.

F2 Forward 1 plot
Accuracy and speed on turbulent Kolmogorov flow
Forced Kolmogorov flow, forward
Each solver on 32² to 256² grids against a converged Exponax run at 1024², from three turbulent states of the Kolmogorov flow at ν = 2·10⁻³. Every grid runs at the CFL number of 64² with dt = 0.01 and is scored on the 64² grid. Relative error at t = 4 against the wall time of one time unit, and relative error per time on each grid, as medians over the states.

F2 Forward 1 plot
Accuracy on the laminar Kolmogorov transient
Forced Kolmogorov flow, forward
Relative error vs grid resolution \(N\) of the flow that the Kolmogorov force \((A\sin(\kappa y), 0)\), \(\kappa = 4\), drives from rest against linear drag, at \(t = 2\). The flow stays a shear flow, so it has the exact solution \(u = (A/\lambda)(1 - e^{-\lambda t}) \sin(\kappa y)\) with \(\lambda = \nu\kappa^2 + \alpha\). The timestep is small enough that the error is the spatial one.

F2 Forward 1 plot
Accuracy across viscosity (Taylor–Green)
Periodic box, forward
Relative error vs viscosity \(\nu\) for each solver at a fixed TGV initial condition.


F2 Gradient 1 plot
Gradient overview

F2 Gradient 2 plots
Gradient against finite differences
Periodic box, gradient
U-curves of finite-difference gradient error vs perturbation size \(\varepsilon\) together with subspace cosine; validates VJP correctness.

F2 Gradient 1 plot
Gradient against the analytic Taylor–Green gradient
Periodic box, gradient
Relative error and 1 − cosine of each solver’s gradient of \(J = \sum \lvert\mathbf{u}(T)\rvert^2\) with respect to the TGV initial field, against the exact gradient \(\nabla J = 2 e^{-4\nu T}\,\mathbf{u}_0\). The closed form holds for divergence-free perturbations, so each gradient is compared after projecting out its curl-free part. There is no finite-difference step to tune, but the error includes the forward discretization error.

F2 Gradient 1 plot
Viscosity gradient against the analytic gradient
Periodic box, gradient
Relative error of each solver’s derivative of \(J = \sum \lvert\mathbf{u}(T)\rvert^2\) with respect to the viscosity for the TGV, against the exact \(dJ/d\nu = -4T\,J\) with \(J = e^{-4\nu T} \sum \lvert\mathbf{u}_0\rvert^2\) on the grid. The error includes the forward discretization error.

F2 Gradient 1 plot
Gradient accuracy across the control parameter
Periodic box, gradient
Gradient norm, best-\(\varepsilon\) FD error, direction cosine, and U-curves vs the sweep parameter.

F2 Gradient 1 plot
Gradient accuracy across rollout length
Periodic box, gradient
Gradient norm, FD error, and direction cosine vs rollout horizon \(T = \mathrm{steps}\cdot dt\).

F2 Gradient 2 plots
Gradient through chained solver calls
Forced Kolmogorov flow, gradient
Finite-difference check of the gradient of a loss on 16 chained solver calls of 0.1 time units each, on the Kolmogorov flow at 64² and dt = 0.01, from a turbulent state of its ground truth plus a 1% divergence-free offset. The loss is the mean relative squared distance to the solver’s chain from that state, as in training through a solver, so its cotangents are far smaller than those of the single-call checks. Error and 1 − cos against ε, over 8 divergence-free directions.

F2 Optimization 3 plots
Inflow optimization for drag
Channel flow past a cylinder, optimization
Drag minimization over the inlet profile of the DFG 2D-1 channel at a fixed flow rate: drag coefficient per iteration, optimized vs initial inflow profiles, and the flow fields before and after.

F3 Initial conditions 1 plot
Initial conditions overview

F3 Forward 1 plot
Agreement between solvers
Triply periodic box, forward
3D velocity magnitude fields and kinetic energy spectra per solver, swept over viscosity ν, compared against a converged spectral reference. (The 3D TGV initial condition is not advection-free, so the linearized analytic decay is only a short-horizon consistency check, not an accuracy reference.) The reference is an Exponax run at N=64, spectrally truncated to N=16. Exponax’s low error here, and its top place in the forward ranking, therefore largely measure agreement with its own higher-resolution solution.

F3 Forward 1 plot
Agreement with the reference
Triply periodic box, forward
Relative error vs grid resolution N against a converged spectral reference at t=1.28, refining space and time together at a fixed CFL number. The legend gives each solver’s observed order of accuracy p.


F3 Gradient 1 plot
Gradient overview

F3 Gradient 2 plots
Gradient against finite differences
Triply periodic box, gradient
Finite-difference gradient error U-curves and direction cosine vs perturbation ε for each solver on the 3D Taylor-Green vortex IC.

F3 Gradient 1 plot
How far gradients reach in rollout length
Triply periodic box, gradient
Per-solver rollout-limit table reporting step count at first failure, failure type, and wall time per successful step.

F3 Optimization 2 plots
Initial-condition recovery (L-BFGS)
Triply periodic box, optimization
Final IC recovery error per solver from zero-initialised L-BFGS optimisation with divergence-free projection.












