Verification status
The package was first overhauled on a machine with no Linux, conda or OpenFOAM, and tested against fake solvers. It has
since been run against a real DAFoam v5.1.1 / OpenFOAM v2506 built from source on ARM64 Linux (a Lima VM on an
Apple-silicon Mac, scripts/vm/). This page states exactly what each claim rests on.
Verified on the real solver (ARM64 Linux, DAFoam 5.1.1, 4032-cell NACA 0012, Euler-mode case, 1 and 4 MPI ranks)
Claim |
Evidence |
|---|---|
DAFoam, OpenFOAM v2506 (with DAFoam’s MPI patch) and the reverse-mode-AD OpenFOAM build and import on ARM64 |
|
The interface runs a real flow solve: alpha = 3 deg, 238 m/s gives CL = 0.4706, CD = 0.01174 (117 counts); the SIMPLE solve converges to the 1e-8 tolerance in 164 iterations from a cold start |
|
Adjoint derivatives are correct. Finite differences converge onto the adjoint as the step grows past the noise floor: best-step disagreement 0.2 to 0.7% (alpha, camber), 1 to 2% (thickness), 0.1 to 0.5% for CL. At a step of 1e-3 or below the finite differences are noise (8% to 34% off), which is why a naive single-step check fails |
|
A real optimization works: |
run logs, |
The initial design’s drag includes a real shock: the surface C_p drops sharply at about 30% chord (from -1.45 to -0.55, upper surface), and the optimized design has none. So the drag reduction is wave-drag reduction, not an artifact of the optimizer |
|
|
|
The 336-cell test mesh ( |
|
The install is reproducible: every download is checksum-verified (the 8 hashes were computed independently in the VM), the two branch-only sources are pinned to commits, the Python and lab-package versions are recorded |
|
Cost on this machine, 4032 cells: forward solve about 3.9 s (1 rank) and 1.4 s (4 ranks); adjoint (two outputs) about 7 s at the base design on 4 ranks, up to about 31 s (4 ranks) or 101 s (1 rank) at a design with CL 0.58, so it depends on the flow state; first |
|
The CSDL graph itself is not the cost: a 2,400-node graph compiles in about 5 to 9 s. The slow first call was our bug (inline recorder re-executing the adjoint 14 times instead of 2), now fixed |
|
No GPU: DAFoam and OpenFOAM are CPU-only MPI codes |
DAFoam docs and source; the VM has no GPU passthrough |
Verified without DAFoam (fake solvers, native checks)
Claim |
How |
|---|---|
The package builds a wheel, installs into a clean environment pulling only NumPy and SciPy, ships its data (geometry, mesh, cases), and its console script works |
built and installed the wheel in a fresh venv |
|
|
The |
real STEP import, caching, projection of the real wall mesh (max error 2.7e-6), FFD thickness and camber response |
|
exact comparison against closed-form linear fakes, both adjoint methods; deliberate sign/hand-back bugs are caught |
|
|
IDWarp-JAX on the real bundled airfoil mesh: wall points land on the prescribed surface (2e-5), the span coordinate is untouched, no cell inverts and none falls below 69% of its volume even for a 50%-thickness plus 5%-camber change (86% with the default |
|
Warped meshes pass OpenFOAM v2506’s own |
|
The bundled mesh and case files are accepted by OpenFOAM v2506 |
|
OpenSQP (modOpt 0.3.1) solves the CSDL problem, hands its final design back to the simulator, and needs |
|
The interface calls only DAFoam methods that exist in v4.0.4 and v5.1.1 |
compared against both releases’ |
Python 3.9 and NumPy 2.0 / SciPy 1.13 / JAX 0.4.30 |
the test run |
Also verified on the real solver: parallel runs
Claim |
Evidence |
|---|---|
1 and 4 MPI ranks give the same answer (CL 0.57947, CD 0.012846 to the printed digits at the same design), so IDWarp-JAX’s mapping of each rank’s points into the global mesh works with a real |
|
The optimization example runs on 4 ranks |
|
Not verified
Item |
Why it matters |
What to do |
|---|---|---|
modOpt does not report convergence on this problem. The 100-iteration run ends at the iteration cap: drag has been flat since about iteration 65 (75.42 counts) and the lift constraint is met to 1e-7, but optimality reaches only about 6e-5 against a tolerance of 1e-5 |
the design is a good local result for this mesh, but the optimizer’s own criterion was not met |
look at scaling of the design variables, and try |
Whether the optimum is physically meaningful. The mesh has only 4,032 cells and the Euler-mode case has no resolved boundary layer, so the 117-count baseline drag is likely dominated by numerical dissipation and a smeared shock, not wave drag alone, and an optimizer can exploit mesh-resolution artifacts |
do not read these drag numbers as physical; the design changes (thinner, cambered, alpha 2.8) are plausible but unvalidated |
refine the mesh and re-evaluate the optimized shape; compare with RANS |
The RANS case ( |
only the Euler-mode case has been run |
|
OpenSQP against PySLSQP on the real problem |
only OpenSQP was run |
|
The conda recipes ( |
still never built. The source build revealed that they are incomplete: DAFoam’s C++ also needs Hisa4DAFoam built first (its headers are on the include path), OpenFOAM’s FFTW-dependent utilities need a second |
port those three findings into |
x86-64 Linux, and the build script on anything but Ubuntu 24.04 ARM64 |
verified only on one platform |
run |
DAFoam’s own regression suite ( |
not run: the test for our solver ( |
install the MACH components or accept our own |
IDWarp-JAX: the second symmetry plane (y = 0.1) it does not model, far-field motion, and scale |
the solve and the adjoint were fine with them on this mesh; their effect on accuracy is unquantified, and every rank warps the whole mesh, untested for large 3D meshes |
refine, compare with the Fortran IDWarp |
The GitHub workflows ( |
written, never run |
they run on the pull request; Pages also needs Settings, Pages, Source: “GitHub Actions” |
3D visualization ( |
tested only on the one-cell-thick 2D mesh |
try on a 3D case |
|
measured on one gradient only (29% faster, derivative error 7e-4) |
run an optimization with it and compare the optimum |
Open questions for the maintainers
Is publishing a source-built OpenFOAM package to the
lsdolabchannel acceptable (size, GPL licensing of DAFoam/OpenFOAM, rattler-build runner time)? The alternative is to keep the DAFoam stack in a single user-built environment and publish onlycsdl_dafoam.Should
lsdo-geoandlsdo-function-spaces(PyPI) also be published on the channel so the environment needs no pip section?