Kestrel CFD Calibration
SD7032 · SD7062 · SA7038 · MH114 · Re 200,000–600,000 · OpenFOAM 14, steady RANS

Kestrel CFD Calibration

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.

13–20 Sep 2026 About 60 settled 2D cases · 5 settled 3D About 32 h wall-clock · about 450 core-hours Reference data: UIUC LSATs Vol. 1 & 3
Bottom line

What the CFD is good for

Trust
  • Fully turbulent CFD (k-ω SST) from 0° to 7°: lift within 5%, drag within 4% of tunnel data for a tripped (turbulent) boundary layer. This is the as-built wing: joints, paint, and bugs.
  • Transition-model lift (k-ω SST-LM): within about 5% at most angles. SD7062 reads low near zero lift; the lift-fix settings below help.
Correct first
  • Transition-model drag for a clean wing reads high, and the error grows with angle: about right near zero lift, +7 to +21% at cruise, +25 to +35% from 5° to 9°. Multiply by the factors in the correction table, or use the tunnel polars directly where they exist.
Don't use
  • Anything near stall (about 9° and up on these foils): lift reads too high, drag swings between iterations and never settles. CFD can't give you CLmax here.
  • The transition model in a 3D wing mesh under the ANSYS Student 1M-cell cap: it can't resolve the laminar separation bubble that sets the drag.
CFD error against the wind tunnel, by angle of attackError = CFD ÷ tunnel − 1. Shaded band is ±5%. Fully turbulent CFD is compared with tripped tunnel data; transition-model CFD with clean data. Hollow markers never settled.
Pick a method by question

Which CFD setup answers your question

How much lift will this section make?
Transition model (k-ω SST-LM). For thick sections like SD7062, use the lift-fix variant.
±5%, plus ±4% from the grid
What drag will a clean, well-built wing have?
Use the UIUC polars if the airfoil has them. Otherwise run the transition model and multiply drag by the correction factor for that angle.
factor 0.74–1.0 by angle
What drag if the boundary layer trips early?
Fully turbulent k-ω SST. Treat it as the upper bound on drag for a real built wing.
±4% drag from 0° to 7°
What is CLmax? When does it stall?
Not from steady RANS. Use the tunnel data or XFOIL, and plan for a margin.
lift +9 to +15% too high at 8–10°
How does the whole 3D wing behave?
3D fully turbulent SST for lift, span loading and induced drag. Swap in 2D clean profile drag at each station's local CL.
see “Taking this to 3D”
CFD results

What the flow looks like: SD7062 at 5.5°

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.

Flow speed |U| / U∞, transition modelSuction peak just behind the leading edge, the slow region under the airfoil, and the wake leaving the trailing edge.
slow
fast
00.40.81.21.6
Turbulence (eddy viscosity νt/ν), transition modelThe boundary layer stays laminar (no turbulence) over the front 40% of the upper surface, then turns turbulent after the bubble.
0.1
300
0.1110100
Turbulence (eddy viscosity νt/ν), fully turbulentTurbulent from the leading edge on both surfaces. More skin friction, no bubble, and the tripped-wing drag the tunnel measured.
0.1
300
0.1110100
Close-up above the upper surface: streamwise velocity Ux/U∞, transition modelx/c 0.18–0.52, vertical scale stretched 2×. Blue is flow running backwards: the laminar separation bubble from 26% to 41% chord.
reversed
fast
−0.2500.51.01.6
Same close-up, fully turbulentThe turbulent boundary layer stays attached, with no reversed flow anywhere on the surface.
reversed
fast
−0.2500.51.01.6
Validation 1

Fully turbulent CFD matches tripped tunnel data

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.

SD7062 drag polar, Re ≈ 400,000Tunnel data as lines, CFD as markers. Hollow markers are near-stall cases that never settled.
αCFD ClTunnelErrorCFD CdTunnelError

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.

Validation 2

Transition model vs clean tunnel data

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.

SD7032 drag polar, Re 301,200No tripped data exists for SD7032, so this compares clean flow only.
αCFD ClTunnelErrorCFD CdTunnelErrorCd 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.

Diagnosis

Why the drag is too high: the bubble is too long

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.

Where the bubbles sitUpper-surface separation to reattachment, transition model. The lower surface stayed attached in every case.
Surface pressure and skin friction, SD7062 5.54°Upper surface (solid) and lower surface (dashed), 1.4× grid. Shaded: the bubble, x/c 0.26–0.41.
CasePressure CdFriction CdCFD totalTunnelBubble x/c
What we tried

Every setting we changed, and what it did

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.

Every setting, plotted against the tunnel pointOnly the lift fix moved lift toward the tunnel; nothing moved drag by more than about 2%.
ChangeClCdResult
Stock transition model (baseline)1.0150.0153Lift −5.5%, drag +25%
1.4× finer grid0.9730.0155Drag is not a mesh artifact
ca1 = 1, 4, 8, 16 (stock 2)≈1.016≈0.0153No effect once converged
ce2 100, ca2 0.12——Longer bubble, stopped
cThetat 0.01, sigmaThetat 10—≈0.0155Tracked the baseline
2nd-order turbulence schemes—higherWorse, less stable
Freestream Tu 0.05–1.0% (stock 0.1%)1.015–1.0170.0151–0.0154No effect
Freestream ω 10 (stock 100)1.0130.0153No effect
Custom: s1 8, 16 (stock 2)1.019–1.0210.0150–0.0151Best drag, −2%
s1 16 + cap 101.0250.0152No real change
Lift fix: s1 16, cap 10, RTreattach 1001.0620.0154Lift −1.2%, drag unchanged
kkLOmega model—0.054 / <0Unusable

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.

Recipe

Exact settings behind these numbers

Mesh (2D C-grid, blockMesh)

Chord
0.3048 m
Farfield
radius 20c ahead, 20c wake
First wall cell
1.28e-5 m (y+ ≤ 1, mean ≈ 0.3)
Cells
100 front + 200 rear per surface, 120 wake, 160 normal = 134,400
Surface spacing
0.3 mm at LE, 0.5 mm at TE
Watch out
Keep farfield cells from turning into needles. Our first layout crammed 200 cells into a 0.21 m-wide outer edge, which produced fake turbulence far from the airfoil and wrong drag. Spread the rear blocks' outer corners downstream.

Freestream and walls

Tu
0.1% → k∞ = 1.5 (U·Tu)²
ω∞
100 1/s (transition) · 10 1/s (SST)
Reθt∞
1173.51 − 589.428·Tu + 0.2196/Tu² = 1137
Farfield
freestreamVelocity, freestreamPressure, inletOutlet for k, ω, γ, Reθt
Wall
noSlip; k = 1e-10; omegaWallFunction; nutLowReWallFunction; γ and Reθt zero-gradient

Solver (foamRun -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

Turbulence model files

// 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.

When a run is done

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.

Cost

Compute time

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.

Throughput vs cases run at once (7900X)2D cases, iterations 100–200. The dashed line is perfect scaling.
Jobs / iterationIterationsWall-clock
One 2D case (134k cells), alone0.84,500–9,0001–2 h
2D cases, 6 at once1.1 each4,500–9,0001.5–3 h
2D cases, 12–14 at once1.5–2.0 each4,500–9,0002–5 h
2D 1.4× grid (263k), 2 cores1.6–1.86,000–12,0003–6 h
Near-stall 2D (never settles)1.5–2.012,000 cap5–7 h
3D near-cap wing (730k), 12 cores2.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.

3D result · SolidWorks tapered wing

The whole wing, fully turbulent

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.

Cruise, 30 lb at 45 mphL/D 23.8α 3°, CL 0.593, corrected
Raw fully turbulentL/D 19.0upper bound on drag
Span efficiencye = 0.979from the CFD load distribution
Cruise power~100 W1.1 lb of drag
Lift-to-drag against angle of attackRaw fully turbulent CFD, and the same runs with the tunnel-derived profile-drag correction. Shaded: the cruise band for 28–30 lb at 45 mph.
αCLCDL/DCDiCDpL/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.

Tip flow, to scale

The wingtip vortices, and what they actually cost

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.

Streamwise vorticity behind the starboard tip, α 3°Each panel is 0.59 m spanwise by 0.38 m vertical. Colour saturates at the limit printed on each panel; the scale is set per panel because the core weakens by a factor of ten across this distance.
clockwise
anticlockwise
−max0+max

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.

Spanwise lift distributionLift per unit span from 40 force bins on the wing, against the elliptical distribution carrying the same total lift.
Cruise drag budget
Recoverable by perfecting the tip loading

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.

Method

How the 2D calibration carries into 3D

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.

No tunnel data

MH114, transition model, Re 400,000

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.

αClCFD CdIndicative clean CdStatus
−2°0.6110.01200.0104–0.0120settled
2°1.0160.01370.0114–0.0129settled
6°1.4450.01900.0140–0.0152drag still swinging ±3%
10°1.8140.029—near stall, drag swinging ±15%