We ran 2D CFD on our candidate airfoils and checked every result against real wind-tunnel polars from the UIUC low-speed airfoil tests. This page says which CFD numbers you can trust, which ones need a correction, and the exact setup that produced them.
Two settled solutions on the same 134k-cell mesh at Re 399,900: the transition model at 5.54° and the fully turbulent model at 5.48°. The flow comes in from the left, tilted up by the angle of attack. The airfoil is drawn in grey.
UIUC also tested SD7062 with a zig-zag trip strip at 2% chord on the upper surface and 5% on the lower, which forces the boundary layer turbulent. That is what fully turbulent CFD models, so the two should agree. They do, until the tripped airfoil starts to stall.
| α | CFD Cl | Tunnel | Error | CFD Cd | Tunnel | Error |
|---|
Tripped tunnel data: SD7062 model B with zig-zag trip, Re 401,200. CFD: kOmegaSST at Re 401,200 (399,900 at 5.48°), 134k-cell C-grid.
Without a trip, both airfoils keep a long run of laminar flow, and that is where low-Reynolds sections get their low drag. The transition model gets lift about right but puts too much drag on both foils, more as the angle goes up.
| α | CFD Cl | Tunnel | Error | CFD Cd | Tunnel | Error | Cd factor |
|---|
Cd factor = tunnel ÷ CFD, what you multiply transition-model drag by to get clean-wing drag. Rule of thumb from these two foils: ≈1.0 near zero lift on SD7062 (≈0.87 on SD7032), 0.83–0.94 at 2–4°, 0.73–0.80 at 5–9°. Rows in grey italics are near-stall cases stopped at the 12,000-iteration cap. They are the mean of a still-oscillating solution.
On the upper surface, the laminar boundary layer separates, travels as a free shear layer, turns turbulent, and reattaches. That region is a laminar separation bubble. The CFD predicts bubbles 15–27% of the chord long. A bubble that long thickens the boundary layer behind it, which adds pressure drag, and flattens the suction peak, which costs lift.
Splitting the drag confirms it. At 5.54° on SD7062, friction drag is 0.0055, a normal value. Pressure drag is 0.0102, about two-thirds of the total and where the excess sits. Refining the grid by 1.4× changed drag by under 3%, so this is the model, not the mesh.
The pressure plot shows the tell-tale plateau: suction stops recovering across the bubble, then jumps back at reattachment. Skin friction goes negative across the same stretch.
| Case | Pressure Cd | Friction Cd | CFD total | Tunnel | Bubble x/c |
|---|
All at SD7062, 5.54°, Re 399,900, where tunnel data gives Cl 1.074 and Cd 0.0122. Every run started from uniform flow and ran until forces settled. Every change lands in the same small cluster, well away from the tunnel point, which is why the recipe uses correction factors instead.
| Change | Cl | Cd | Result |
|---|---|---|---|
| Stock transition model (baseline) | 1.015 | 0.0153 | Lift −5.5%, drag +25% |
| 1.4× finer grid | 0.973 | 0.0155 | Drag is not a mesh artifact |
ca1 = 1, 4, 8, 16 (stock 2) | ≈1.016 | ≈0.0153 | No effect once converged |
ce2 100, ca2 0.12 | — | — | Longer bubble, stopped |
cThetat 0.01, sigmaThetat 10 | — | ≈0.0155 | Tracked the baseline |
| 2nd-order turbulence schemes | — | higher | Worse, less stable |
| Freestream Tu 0.05–1.0% (stock 0.1%) | 1.015–1.017 | 0.0151–0.0154 | No effect |
| Freestream ω 10 (stock 100) | 1.013 | 0.0153 | No effect |
Custom: s1 8, 16 (stock 2) | 1.019–1.021 | 0.0150–0.0151 | Best drag, −2% |
s1 16 + cap 10 | 1.025 | 0.0152 | No real change |
Lift fix: s1 16, cap 10, RTreattach 100 | 1.062 | 0.0154 | Lift −1.2%, drag unchanged |
| kkLOmega model | — | 0.054 / <0 | Unusable |
The lift fix also helped SD7062 at cruise: lift error −13% → −7% at 0.86° and −7% → −4% at 2.40°, with drag unchanged. On SD7032 it pushed lift 1–1.5 points further above the tunnel data, so use it on thick sections only.
freestreamVelocity, freestreamPressure, inletOutlet for k, ω, γ, ReθtnoSlip; k = 1e-10; omegaWallFunction; nutLowReWallFunction; γ and Reθt zero-gradientfoamRun -solver incompressibleFluid)// system/fvSolution p GAMG, GaussSeidel, tol 1e-7, relTol 0.01 U k omega γ Reθt smoothSolver, symGaussSeidel, tol 1e-8, relTol 0.1 SIMPLE { consistent yes; nNonOrthogonalCorrectors 3; residualControl { all 1e-7; } } // 1e-4 stopped runs early relaxation p 0.3; U k omega γ Reθt 0.5 // system/fvSchemes ddt steadyState grad Gauss linear div(U) bounded Gauss linearUpwindV grad(U) div(turb) bounded Gauss upwind // k, omega, γ, Reθt laplacian Gauss linear corrected
// fully turbulent (no gammaInt / ReThetat fields) RAS { RASModel kOmegaSST; turbulence on; } // transition, stock RAS { RASModel kOmegaSSTLM; turbulence on; } // transition, lift fix (custom library) RAS { RASModel kOmegaSSTLMs2; turbulence on; kOmegaSSTLMs2Coeffs { s1 16; gammaSepMax 10; RTreattach 100; } } // controlDict: libs ("libkOmegaSSTLMs2.so");
kOmegaSSTLMs2 is OpenFOAM 14's kOmegaSSTLM with three hard-coded constants in the separation-induced transition term exposed as settings. Build it with bench/build_lm_s2.sh (about 30 s). At the stock values it is identical to kOmegaSSTLM.
Don't stop on residuals or a fixed iteration count. Stop when Cd moves no more than 2% and Cl no more than 1% over the last 1,000 iterations. From a uniform start that took 4,500–9,000 iterations. Drag kept drifting for thousands of iterations after the residuals looked converged. Near stall it never settles: report the mean and the swing.
Measured on the two machines we used: a laptop with a Core Ultra 9 285H (14 cores, held to about 65 W) and a desktop with a Ryzen 9 7900X (12 cores, DDR5-6000), both running OpenFOAM 14 in WSL2. Both chips are equally fast per core on this case (0.80 vs 0.78 s per iteration). What limits how many cases run at once is memory bandwidth, not core count.
| Job | s / iteration | Iterations | Wall-clock |
|---|---|---|---|
| One 2D case (134k cells), alone | 0.8 | 4,500–9,000 | 1–2 h |
| 2D cases, 6 at once | 1.1 each | 4,500–9,000 | 1.5–3 h |
| 2D cases, 12–14 at once | 1.5–2.0 each | 4,500–9,000 | 2–5 h |
| 2D 1.4× grid (263k), 2 cores | 1.6–1.8 | 6,000–12,000 | 3–6 h |
| Near-stall 2D (never settles) | 1.5–2.0 | 12,000 cap | 5–7 h |
| 3D near-cap wing (730k), 12 cores | 2.2 | ≥ 1,500 | ≥ 55 min |
Planning numbers. A 10–12 angle 2D polar for one airfoil takes about 3–4 hours on the desktop, or an overnight run on the laptop. Past about 6 cases at once on one machine you gain little, but two machines in parallel really do double it. This whole calibration took about 24 hours of wall-clock time across both machines, roughly 350 core-hours. A good share of that went to setups we threw out along the way: a bad first mesh, unstable 2nd-order schemes, and the settings sweeps.
The wing as drawn in SolidWorks: 9 ft span, 18″ root to 6″ tip, straight unswept leading edge, no twist, SD7062 at the root blending to SA7038 at the tip. One million cells, 18 prism layers, y+ averaging 1.5 — a genuinely wall-resolved boundary layer, which is the part a Cartesian cut-cell solver cannot reproduce. Corrected drag applies the tunnel-derived clean/tripped factor to the profile part only; induced drag is left alone, because the transition state of the boundary layer does not change it.
| α | CL | CD | L/D | CDi | CDp | L/D corr. |
|---|
Every case settled to a CL band of 0.0000–0.0006 and a CD band under 0.0006, far inside the 1% / 2% rule. Measured lift-curve slope over 2–7° is 0.0860/deg against 0.0868/deg from lifting-line theory for this planform — 1% apart, by two independent methods. Angles 0°, 10° and 13° were still running when this was written.
Crossflow planes cutting the wake behind the starboard tip, at cruise. Colour is streamwise vorticity ωx — the rotation of the air about the flight direction — and the arrows are the in-plane velocity, so the rotation reads directly. The tip trailing edge sits at x = 0.152 m, so the first plane is about four tip-chords downstream. The wing tip itself is marked.
Read this one carefully. The mesh was built to resolve the wing surface, not the wake — cells coarsen quickly away from the wing, so most of the tenfold decay from the first panel to the last is numerical diffusion, not physics. A real vortex persists far longer. These panels are good for where the vortex is and which way it turns, not for how fast it decays. The forces are unaffected: they are integrated on the wing surface, which is where the resolution went.
Induced drag is real and it is large — 40.6% of cruise drag on this wing. That is the tip vortices' bill, and it is the single biggest line item after profile drag.
But almost none of it is recoverable. Induced drag is set by how the lift is spread across the span, and this planform already sits at e = 0.979 of the elliptical ideal — a taper ratio of 1/3 happens to be very close to optimal. Driving the loading to perfectly elliptical would cut induced drag by 2.1%, which is 0.86% of total drag, and move cruise L/D from 18.95 to 19.11.
The outer fifth of the span carries only 10.6% of the lift, and local Cl falls from 0.66 at mid-span to 0.37 at the outermost bin. There is not much load out there to fix.
Where the drag actually is: 59.4% is profile drag, set by the airfoil sections and the state of their boundary layers — which is exactly what the 2D calibration above addresses, and where the correction moves L/D by 4.8 points, thirty times what perfect tip loading is worth.
What transfers: the model choice, numerics, freestream values and convergence rule. The fully turbulent validation holds best, because SST is forgiving of mesh resolution as long as the prism layers keep y+ near 1.
What doesn't: the transition model's behavior. The 2D cases used about 300 surface points around one chord. A 2.4 m-span wing under the 1M-cell student cap gets far fewer per chord, and resolving the bubble in 3D would need roughly 10M+ cells. Chord and Reynolds number also drop toward the tips, below the 300k–400k range validated here, and the near-cap ANSYS meshes contain cells up to about 89° non-orthogonal.
Recommended build-up: run the 3D wing fully turbulent (SST) for lift, span loading and induced drag. For a clean-wing estimate, replace SST's profile drag with 2D clean profile drag (tunnel polars, or corrected transition-model values) at each station's local Cl.
There is no wind-tunnel data for MH114, so these numbers are only as good as the method validated on the two SD foils. The corrected drag applies the SD correction range for each angle. Treat it as an estimate, not a measurement.
| α | Cl | CFD Cd | Indicative clean Cd | Status |
|---|---|---|---|---|
| −2° | 0.611 | 0.0120 | 0.0104–0.0120 | settled |
| 2° | 1.016 | 0.0137 | 0.0114–0.0129 | settled |
| 6° | 1.445 | 0.0190 | 0.0140–0.0152 | drag still swinging ±3% |
| 10° | 1.814 | 0.029 | — | near stall, drag swinging ±15% |