Skip to content

Airfoil profile generation

The shore.profiles module produces 2D airfoil section coordinates analytically, with no external dependencies beyond NumPy. This page documents the polynomial families, the Selig ordering convention, and the cosine-sampling rule. For the consumer-facing API, see shore profile.

Selig ordering

All sections are returned as (N, 2) arrays ordered around the closed curve starting at the upper trailing edge, walking forward over the suction (upper) surface to the leading edge, then back over the pressure (lower) surface to the lower trailing edge:

out[0]    = upper TE   (x ≈ 1, y ≥ 0)
out[N//2] = leading edge   (x = 0, y = 0)
out[-1]   = lower TE   (x ≈ 1, y ≤ 0)

This matches the format used by the UIUC airfoil database and most CFD pre-processors, so any UIUC .dat drops into shore body extrude directly.

For a sharp TE (closed_te=True, default), out[0] == out[-1] exactly; the polynomial residual is forced to zero so the curve closes. For a blunt TE (closed_te=False), the two endpoints are separated by the natural ~0.1% chord polynomial residual.

Cosine sampling

Points are placed at chord positions x_i derived from a uniform angular sampling of a half-cosine:

xi=12(1cosβi),βi=iπnpts1,i=0,1,,npts1

This clusters samples at the leading edge (x = 0) and trailing edge (x = 1) — the natural NACA parameterisation, matched to the rapid curvature changes there. The argument n_pts is the chord-sample count per side; the closed Selig curve has 2 * n_pts - 1 total points (the LE node is shared between upper and lower).

NACA 4-digit family

Designation MPTT:

  • M = max camber as % chord (first digit)
  • P = camber position in tenths of chord (second digit)
  • TT = max thickness as % chord (last two digits)

Example: 2412 = 2% camber at 40% chord, 12% thickness.

Thickness distribution

The half-thickness is the standard NACA 4-digit polynomial:

yt(x)=5t(a0x+a1x+a2x2+a3x3+a4x4)

with coefficients

a0=0.2969,a1=0.1260,a2=0.3516,a3=0.2843

and the last coefficient picked to control the TE closure:

Forma4TE behaviour
Open TE (original)0.1015yt(1)0.00126 — leaves a ~0.25% chord gap
Closed TE0.1036yt(1)=0 exactly

shore.profiles.naca uses the closed-TE coefficient by default; pass closed_te=False to keep the original open-TE behaviour (useful when you want to detect the resulting blunt TE downstream in the C-grid topology).

Camber line

For M = P = 0 the airfoil is symmetric and the camber line vanishes. Otherwise:

yc(x)={mp2(2pxx2)x<pm(1p)2((12p)+2pxx2)xp

with m=M/100, p=P/10.

Surface coordinates

Upper and lower surfaces are offset perpendicular to the camber line:

xu=xytsinθ,yu=yc+ytcosθxl=x+ytsinθ,yl=ycytcosθ

where θ=arctan(dyc/dx). For a symmetric airfoil (yc=0, θ=0) this collapses to the familiar (x,±yt).

NACA 5-digit family

Designation LPSTT:

  • L = design CL×203. Always 2 in the standard family (giving CLdesign=0.3).
  • P = mean-line shape designation Q{1,2,3,4,5}.
  • S = camber type. 0 = standard, 1 = reflexed.
  • TT = max thickness as % chord.

Example: 23012 = standard mean line 230 with 12% thickness; 23112 is the reflexed counterpart.

Thickness distribution

The 5-digit family uses the same thickness polynomial as the 4-digit family — only the camber line changes.

Standard mean line (S = 0)

From NACA TR-537 (Jacobs & Pinkerton, 1935):

yc(x)={k16(x33mx2+m2(3m)x)x<mk1m36(1x)xm

The coefficients (m,k1) are tabulated by mean-line code Q:

Qdesignationmk1
12100.0580361.40
22200.126051.640
32300.202515.957
42400.29006.643
52500.39103.230

Reflexed mean line (S = 1)

From NACA TR-610. The camber line gains a third segment so the aft loading is opposite to the fore loading — useful for tailless configurations. Coefficients (m,k1,k2/k1):

Qdesignationmk1k2/k1
22210.130051.9900.000764
32310.217015.7930.006770
42410.31806.5200.030300
52510.44103.1910.135500

The reflexed camber polynomial is

yc(x)={k16[(xm)3k2k1(1m)3xm3x+m3]x<mk16[k2k1(xm)3k2k1(1m)3xm3x+m3]xm

The surface-offset rule (upper / lower from yc and yt) is the same as for the 4-digit family.

Out of scope

  • Modified 4-digit (e.g. 0012-64) — sharper LE and a shifted thickness peak; needs additional polynomial coefficients per family.
  • NACA 6-series (e.g. 63-012) — laminar-flow profiles whose thickness distribution comes from solving Theodorsen's conformal-mapping integral. Not closed-form; needs numerical integration.

These can be added later; for the typical airfoil-CFD workflow (symmetric and cambered 4-digit, the canonical 23xxx family) the current coverage is enough.

See also

Released under the MIT License.