Article
Aerospace Engineering · Fluid Dynamics · ⏱ ~14 min read

NACA Airfoil & Wing Aerodynamics — How Wings Generate Lift

NACA (National Advisory Committee for Aeronautics) developed systematic families of airfoil shapes in the 1930s–40s, turning wing design from art to engineering. The four-digit NACA series encodes thickness, camber, and camber-line position in just four numbers — yet captures the key physics that makes commercial aviation possible. Understanding aerofoil theory from potential flow through to separation and finite-wing effects reveals why swept wings, winglets, and high-lift devices look the way they do.

1. NACA 4-Digit Geometry

The four-digit NACA designation MPTT encodes: M = maximum camber (% chord), P = position of max camber (tenths of chord), TT = maximum thickness (% chord).

NACA 2412: M=2%, P=0.4c, T=12% NACA 0012: symmetric (M=0), T=12% Thickness distribution (half-thickness, ±y_t from chord line): y_t(x) = (T/0.2) · c · [0.2969√(x/c) − 0.1260(x/c) − 0.3516(x/c)² + 0.2843(x/c)³ − 0.1015(x/c)⁴] Camber line (z_c) for x ≤ Pc: z_c = (M/P²)(2P(x/c) − (x/c)²) For x > Pc: z_c = M(1−P)⁻² · (1 − 2P + 2P(x/c) − (x/c)²) Upper/lower surface points: x_u = x − y_t · sin(θ), y_u = z_c + y_t · cos(θ) x_l = x + y_t · sin(θ), y_l = z_c − y_t · cos(θ) θ = arctan(dz_c/dx)

2. Lift Mechanism — Circulation and Pressure

Lift does NOT arise because air "must reunite" at the trailing edge — that is a myth. Lift arises because airfoil shape and angle-of-attack deflect air downward:

Kutta condition: flow must leave the sharp trailing edge smoothly → establishes circulation Γ around the aerofoil Kutta-Joukowski theorem (ideal flow): L' = ρ·U·Γ [N/m] (lift per unit span) Bernoulli pressure difference: Upper surface: faster flow → lower pressure Lower surface: slower flow → higher pressure ΔP = P_lower − P_upper → net upward force Pressure coefficient: Cp = (P − P∞) / (½ρU²) = 1 − (V/U)² Leading-edge suction peak: Cp can reach −10 or lower at high α → most lift comes from the first 20–30% of chord

3. Thin-Airfoil Theory

For thin, uncambered flat plate (t/c << 1): C_L = 2π · sin(α) ≈ 2πα (for small α in radians) Lift slope: dC_L/dα = 2π/rad ≈ 0.1097/degree Cambered airfoil adds camber-induced lift at α=0: C_L = 2π(α + α_L0) α_L0 = −(2/c) ∫₀ᶜ (dz_c/dx)(x/c − 1/2)/(x/c)^½ dx (negative for positive camber) Example: NACA 2412 at α=4°: C_L ≈ 2π(4/57.3 + 0.02) ≈ 2π × 0.090 ≈ 0.57 Real airfoils deviate from 2π slope due to viscosity, thickness: Practical dC_L/dα ≈ 0.095–0.105/degree for typical airfoils

4. Pressure Distribution and Cp

C_L = ∫₀¹ (Cp,lower − Cp,upper) d(x/c) Typical Cp distribution (NACA 0012 at α=5°): Leading edge: Cp ≈ +0.9 (stagnation) Peak suction: Cp ≈ −1.8 at x/c ≈ 0.05 (upper) Rear upper: gradual pressure recovery to Cp ≈ 0 Lower: Cp ≈ +0.1 to +0.3 (positive pressure) Adverse pressure gradient (APG): dCp/d(x/c) > 0 on upper rear → Boundary layer decelerates → risk of separation → stall Supercritical airfoils (transonic): flatter upper surface reduces suction peak amplitude → weaker shock wave → delays drag-divergence to higher Mach numbers (used in commercial jets, M_cruise > 0.80)

5. Drag Polar and Lift-to-Drag Ratio

Drag components: C_D = C_D0 (profile/parasite drag) + C_Di (induced drag, finite wing) Profile drag: C_D0 ≈ 0.005–0.015 (thin airfoil, attached flow) Induced drag: C_Di = C_L² / (π·AR·e) AR = b²/S (aspect ratio), e = Oswald efficiency (0.7–0.95) Drag polar: C_D = C_D0 + C_L² / (π·AR·e) (parabolic) Maximum L/D (optimal cruise): (L/D)_max = √(π·AR·e / C_D0) / 2 (at C_L = √(π·AR·e·C_D0)) Example: AR=8, e=0.85, C_D0=0.008: C_L_opt = √(π×8×0.85×0.008) ≈ 0.41 (L/D)_max ≈ √(π×8×0.85 / 0.008) / 2 ≈ 29 (B737 cruise L/D ≈ 17, glider ≈ 50)

6. Stall and Boundary Layer Separation

Stall: C_L reaches maximum then drops, C_D rises sharply Caused by: boundary layer separation when APG too strong Stall types: Leading-edge stall: thin airfoil, short separation bubble bursts → abrupt stall, sudden C_L drop (t/c < 9%) Trailing-edge stall: thick airfoil, gradual separation from rear → gentle C_L curve rounding (t/c > 15%) Thin-airfoil stall: progressive forward movement of separation Stall angle: α_stall ≈ 10–16° (airfoil dependent) C_L,max: typically 1.2–1.8 for clean wings 1.6–2.0 with leading-edge slots/slats 3.0–3.5 with full Fowler flaps + slats Vortex generators (small fins on upper surface): Trip boundary layer to turbulent → resists separation longer → extends stall margin by 2–4° AoA

7. JavaScript NACA Profile Generator

// NACA 4-digit airfoil coordinate generator
function naca4(digits, nPoints = 100) {
  const M = Math.floor(digits / 1000) / 100;       // max camber
  const P = Math.floor((digits % 1000) / 100) / 10; // camber position
  const T = (digits % 100) / 100;                 // thickness

  function thickness(xc) {
    const x = xc;
    return T/0.2 * (0.2969*Math.sqrt(x) - 0.1260*x
                                          - 0.3516*x**2
                                          + 0.2843*x**3
                                          - 0.1015*x**4);
  }

  function camberAndSlope(xc) {
    if (M === 0 || P === 0) return [0, 0];
    if (xc <= P) {
      return [
        M/(P*P) * (2*P*xc - xc*xc),
        2*M/(P*P) * (P - xc)
      ];
    } else {
      return [
        M/(((1-P)**2)) * (1 - 2*P + 2*P*xc - xc*xc),
        2*M/(((1-P)**2)) * (P - xc)
      ];
    }
  }

  // Cosine spacing for better LE/TE resolution
  const upper = [], lower = [];
  for (let i = 0; i <= nPoints; i++) {
    const beta = (Math.PI * i) / nPoints;
    const xc = (1 - Math.cos(beta)) / 2;
    const yt = thickness(xc);
    const [zc, dzc_dx] = camberAndSlope(xc);
    const theta = Math.atan(dzc_dx);
    upper.push({x: xc - yt*Math.sin(theta), y: zc + yt*Math.cos(theta)});
    lower.push({x: xc + yt*Math.sin(theta), y: zc - yt*Math.cos(theta)});
  }
  return {upper, lower};
}

// Simple thin-airfoil lift coefficient
function liftCoeff(alphaDeg, nacaDigits) {
  const alpha = alphaDeg * Math.PI / 180;
  const M = Math.floor(nacaDigits / 1000) / 100;
  const P = Math.floor((nacaDigits % 1000) / 100) / 10;
  // Zero-lift angle (approximate for NACA 4-digit):
  const alpha_L0 = -M * (1 - P) * 2; // simplified
  return 2 * Math.PI * (alpha - alpha_L0);
}

// Example: NACA 2412
const profile = naca4(2412);
console.log(`NACA 2412 at α=4°: C_L = ${liftCoeff(4, 2412).toFixed(3)}`);
// → C_L ≈ 0.570

8. Finite Wing — Induced Drag and Winglets

💧 Open SPH Fluid →