Thin Airfoil Section Theory (aerodynamics/airfoil/thin-airfoil-section-theory)
Use when you must turn a thin airfoil's camber line into its analytic
section aerodynamics: the Glauert sine-series coefficients of the camber
slope, the zero-lift angle, the section lift curve and the quarter-chord
pitching moment. This leaf computes the closed-form thin-airfoil solution
in pure stdlib Python, with trapezoid quadrature used only for the Fourier
integrals over the theta transform. It pairs with
aerodynamics/airfoil/airfoil-geometry, which produces the mean camber line
ordinates and slope consumed here (both leaves can be cross-checked on the
same NACA 2412 camber line), and it supplies the analytic anchor that the
numerical and viscous section layers beneath it verify against. Section
coefficients are derived here from the camber line; the finite-wing slope
leaf aerodynamics/drag-polars/lift-curve-slope instead consumes alpha_zero
and the section slope as given inputs for its aspect-ratio and sweep
corrections, so it is the complement, not the duplicate.
Domain quick reference
- Glauert theta transform: x = (1 - cos(theta))/2 maps the chord x in [0, 1]
onto theta in [0, pi], clustering stations at the leading edge where the
camber slope varies fastest. All integrals run over this theta grid.
- Camber slope input routes: NACA 4-digit mean line (m, p) with dz/dx =
(2m/p^2)(p - x) for x <= p and dz/dx = (2m/(1-p)^2)(p - x) for x >= p
(zero at x = p, matching the airfoil-geometry formulas); polynomial mean
line z = sum(c_i x^i) with dz/dx = sum(i c_i x^(i-1)); or sampled (x, z)
stations read as piecewise-linear camber with constant slope per segment.
- Glauert sine-series coefficients (gamma(theta) = 2U(A0 (1+cos)/sin +
A1 sin(theta) + A2 sin(2 theta))):
A0 = alpha - (1/pi) int dz/dx dtheta,
A1 = (2/pi) int dz/dx cos(theta) dtheta,
A2 = (2/pi) int dz/dx cos(2 theta) dtheta.
- Zero-lift angle: alpha_L0 = (1/pi) int dz/dx (1 - cos(theta)) dtheta,
identically -A0(alpha = 0) - A1/2; the identity A0(alpha_L0) = -A1/2
holds exactly, so cl vanishes at the zero-lift angle.
- Section lift: cl = 2 pi A0 + pi A1 = 2 pi (alpha - alpha_L0).
- Quarter-chord pitching moment (aerodynamic center at c/4):
cm_c4 = (pi/4)(A2 - A1), equivalently cm_le + cl/4 with
cm_le = -(pi/2)(A0 + A1) + (pi/4) A2. The mistranscribed reading
-(pi/4)(A1 + A2) is off by (pi/2) A2 and fails the identity; it is
rejected (it coincides with the classical form only at A2 = 0).
- Center of pressure: x_cp/c = 1/4 - cm_c4/cl, defined only at nonzero lift.
- KNOWN-EXACT closed forms: the parabolic mean line z = 4m x (1 - x) (the
NACA 4-digit mean line at p = 0.5) gives alpha_L0 = -2m, A1 = 4m, A2 = 0,
cm_c4 = -pi m exactly; a flat mean line gives A0 = alpha and zero
everything else. Incompressible potential flow only: no Mach effects, no
viscosity, no stall.
Workflow
- Choose the camber-line input route: NACA 4-digit mean-line parameters
(m, p) with glauert_coefficients_naca4, polynomial power-series
coefficients with glauert_coefficients_poly, or sampled (x, z) camber
stations spanning [0, 1] with glauert_coefficients_points. All three
take alpha_rad first and default to n_theta = 40000 quadrature intervals.
- Run the Glauert sine-series decomposition: each route integrates the
camber slope dz/dx by trapezoid quadrature on the uniform theta grid
(endpoints included) and returns A0, A1, A2 and the zero-lift angle
alpha_L0 as a 4-tuple.
- Recover the section lift coefficient with lift_coefficient(alpha_rad,
alpha_L0_rad) = 2 pi (alpha - alpha_L0); cross-check the identity
cl = 2 pi A0 + pi A1 on the same coefficients.
- Read the quarter-chord pitching-moment coefficient with
quarter_chord_moment(A1, A2) = (pi/4)(A2 - A1); verify via the
independent route cm_le + cl/4 when the full series is available.
- Locate the center of pressure with
center_of_pressure_over_chord(cl, cm_c4) = 1/4 - cm_c4/cl; the function
raises ValueError at |cl| < 1e-12, where the cp is not defined.
- Confirm the deterministic checks with the contract test
scripts/test_thin_airfoil_section_theory.py.
Worked example
NACA 2412 mean line (m = 0.02, p = 0.4) at alpha = 4 deg =
0.069813170080 rad, the section whose camber line airfoil-geometry also
handles. Real module outputs (trapezoid quadrature, n_theta = 40000):
- glauert_coefficients_naca4(0.069813170080, 0.02, 0.4): A0 =
0.065320283700, A1 = 0.081495141601, A2 = 0.013861276465, alpha_L0 =
-0.036254684420 rad = -2.077240404870 deg, within a few hundredths of a
degree of the measured 2412 zero-lift angle near -2 deg.
- Zero-lift identity: alpha_L0 = -A0(0) - A1/2 agrees with the direct
integral to 1.3e-16; A0(alpha_L0) = -0.040747570801 equals -A1/2.
- Section lift: cl = 2 pi (0.069813170080 + 0.036254684420) =
0.666443984960, matching cl = 2 pi A0 + pi A1 to 7.8e-16; at alpha = 0
the camber alone lifts at cl = 0.227794900467.
- Quarter-chord moment: cm_c4 = (pi/4)(A2 - A1) = -0.053119513461, near the
familiar measured 2412 cm0.25 of about -0.05; the route cm_le + cl/4
gives the same value to 1.9e-16, while the mistranscribed
-(pi/4)(A1 + A2) = -0.074892755617 is off by (pi/2) A2 = +0.021773242156.
- Center of pressure: x_cp/c = 1/4 - cm_c4/cl = 0.329705893759: the cp sits
at 0.330 chord at 4 deg and moves back toward the quarter chord as cl
grows.
- Quadrature convergence: A1 at n_theta = 40000 agrees with n_theta =
1000000 to 3.0e-13, so the default resolution is converged at the kinked
2412 slope to all printed digits.
KNOWN-EXACT validation on the parabolic mean line z = 4m x (1 - x), m =
0.04 (polynomial route, coeffs [0.0, 0.16, -0.16]) at 4 deg: exact closed
forms are alpha_L0 = -2m = -0.08 rad, A1 = 4m = 0.16, A2 = 0, cm_c4 =
-pi m = -0.125663706144, cl(4 deg) = 0.941303909067, cl(0) = 4 pi m =
0.502654824574, x_cp/c(4 deg) = 0.383499611478. Quadrature recovers them
to 1e-15, and the NACA 4-digit route at p = 0.5 reproduces the parabola
exactly (A1 = 0.160000000000, alpha_L0 = -0.080000000000, cm_c4 =
-0.125663706144). A flat mean line (coeffs [0.0, 0.0]) gives A0 =
0.069813170080 = alpha with A1 = A2 = alpha_L0 = cm_c4 = 0.
Sampled camber stations: a 4001-station sample of the parabola gives
alpha_L0 = -0.079999658257 (3.4e-7 from -2m) and A1 = 0.159999318515
(6.8e-7 from 4m); a 4001-station sample of the 2412 mean line gives
alpha_L0 = -0.036254564543 rad and cm_c4 = -0.053119329442, within 1.2e-7
and 1.8e-7 of the analytic route respectively.
Verification
- glauert_coefficients_naca4(0.069813170080, 0.02, 0.4) returns A0 =
0.065320283700, A1 = 0.081495141601, A2 = 0.013861276465, alpha_L0 =
-0.036254684420 within 1e-9 of the spec anchors.
- lift_coefficient gives 0.666443984960 at 4 deg and 0.227794900467 at
alpha = 0; quarter_chord_moment gives -0.053119513461;
center_of_pressure_over_chord gives 0.329705893759, all within 1e-9.
- Closed forms hold: parabolic alpha_L0 = -2m, A1 = 4m, A2 = 0,
cm_c4 = -pi m; flat mean line A0 = alpha with the rest zero; the
identities alpha_L0 = -A0(0) - A1/2, A0(alpha_L0) = -A1/2,
cl = 2 pi A0 + pi A1 = 2 pi (alpha - alpha_L0) and cm_c4 = cm_le + cl/4
all hold to 1e-12.
- Convergence: A1 at n_theta = 1000000 differs from n_theta = 40000 by
3.0e-13 on the 2412 mean line.
- ValueError rejection: m = -0.01 and m = 0.2 (4-digit camber range),
p = 0.0 and p = 1.0, n_theta below 100 or non-int, empty or non-list
polynomial coeffs, non-monotone sample stations, sample stations not
spanning [0, 1], and center_of_pressure_over_chord at |cl| < 1e-12.
- Run the deterministic contract test offline: python3
scripts/test_thin_airfoil_section_theory.py (33 tests, under 2 s).
Related leaves
- aerodynamics/airfoil/airfoil-geometry: produces the mean camber line
ordinates and slope consumed here; the NACA 2412 cross-check airfoil is
shared by both leaves.
- aerodynamics/drag-polars/lift-curve-slope: the finite-wing slope leaf
that consumes alpha_zero and the section slope as inputs; complementary
scope, never a duplicate of the camber-line derivation.
- aerodynamics/airfoil/xfoil-analysis: numerical viscous section results
that use the analytic section solution as their verification anchor.
- aerodynamics/cfd/panel-method: the numerical potential layer beneath the
closed-form section solution.
Pitfalls
- Transcribing the quarter-chord moment with the wrong sign: the anchor
rejects cm_c4 = -(pi/4)(A1 + A2), which is off by (pi/2) A2 and fails
the identity cm_c4 = cm_le + cl/4. The classical relation is
cm_c4 = (pi/4)(A2 - A1).
- Deriving section data that is input elsewhere: alpha_zero and the
section slope are inputs to the lift-curve-slope leaf for its finite
aspect-ratio and sweep work; this leaf derives them from the camber
line instead. Do not reuse the lift-curve-slope routing tag for this
leaf's camber-line claim.
- Reading the camber as lift: the flat mean line still lifts at
cl = 2 pi alpha; only the zero-lift angle, not the slope 2 pi, is set
by camber.
- Calling the center of pressure at zero lift: x_cp/c = 1/4 - cm_c4/cl
diverges as cl approaches zero; the module raises ValueError at
|cl| < 1e-12 rather than return a meaningless station.
- Feeding sample stations that are not strictly increasing or that do not
span exactly [0, 1]: the piecewise-linear route rejects both, since a
camber line must cover the full chord once.
- Under-resolving the quadrature: kinked 4-digit slopes converge slowly
(A1 needs about 40000 intervals to reach 1e-12); the default
n_theta = 40000 is converged, but n_theta below 100 is rejected.
- Extending beyond the model: no Mach correction, viscosity or stall lives
in this leaf; it is the incompressible potential-flow section solution
only.
Behavior contract (gate 3)
Run the deterministic contract test (stdlib unittest, offline):
python3 scripts/test_thin_airfoil_section_theory.py
The 33 tests cover the NACA 2412 worked example at 4 deg (all four Glauert
coefficients, the zero-lift angle in rad and deg, cl at 4 deg and at zero
alpha, the quarter-chord moment, the center of pressure), the closed-form
identities (zero-lift angle from -A0(0) - A1/2, A0(alpha_L0) = -A1/2, the
two cl routes, cm_c4 = cm_le + cl/4, rejection of the A1 + A2
mistranscription), the KNOWN-EXACT parabolic mean line through the
polynomial route and the NACA p = 0.5 crossover, the flat mean line,
quadrature convergence at one million intervals, the 4001-station sampled
camber routes, and ValueError rejection of every non-physical input
listed in the spec. All numeric asserts are order-safe
(assertAlmostEqual with delta or math.isclose); no exact float equality
on computed sums.
Compliance
- NACA Report 824 (naca-tr-824) frames the thin-airfoil theory context as
US government work in the public domain; the relations above are
standard engineering methodology from Anderson and Katz and Plotkin,
summary-only per standards-map.yaml, never reproduced verbatim.
- compliance: STANDARDS-REF, gated: false.
1---2name: thin-airfoil-section-theory3description: Use when you must compute the section lift and the quarter-chord pitching moment of a thin cambered airfoil from its camber line: decompose the camber slope into the glauert-sine-series coefficients A0, A1 and A2 by trapezoid quadrature over the theta transform x = (1 - cos(theta))/2, then recover the zero-lift angle alpha_L0, the section lift coefficient cl = 2*pi*(alpha - alpha_L0), the quarter-chord pitching-moment coefficient cm_c4 = (pi/4)*(A2 - A1) and the center-of-pressure location x_cp/c = 1/4 - cm_c4/cl, for a NACA 4-digit mean line, a polynomial camber line or sampled camber stations. Produces the closed-form analytic section aerodynamics that anchor the numerical panel and viscous section tools. Trigger: glauert coefficients, zero lift angle, section pitching moment, camber line analysis, thin airfoil section.4license: Apache-2.05---67# Thin Airfoil Section Theory (aerodynamics/airfoil/thin-airfoil-section-theory)89Use when you must turn a thin airfoil's camber line into its analytic10section aerodynamics: the Glauert sine-series coefficients of the camber11slope, the zero-lift angle, the section lift curve and the quarter-chord12pitching moment. This leaf computes the closed-form thin-airfoil solution13in pure stdlib Python, with trapezoid quadrature used only for the Fourier14integrals over the theta transform. It pairs with15aerodynamics/airfoil/airfoil-geometry, which produces the mean camber line16ordinates and slope consumed here (both leaves can be cross-checked on the17same NACA 2412 camber line), and it supplies the analytic anchor that the18numerical and viscous section layers beneath it verify against. Section19coefficients are derived here from the camber line; the finite-wing slope20leaf aerodynamics/drag-polars/lift-curve-slope instead consumes alpha_zero21and the section slope as given inputs for its aspect-ratio and sweep22corrections, so it is the complement, not the duplicate.2324## Domain quick reference2526- Glauert theta transform: x = (1 - cos(theta))/2 maps the chord x in [0, 1]27 onto theta in [0, pi], clustering stations at the leading edge where the28 camber slope varies fastest. All integrals run over this theta grid.29- Camber slope input routes: NACA 4-digit mean line (m, p) with dz/dx =30 (2m/p^2)(p - x) for x <= p and dz/dx = (2m/(1-p)^2)(p - x) for x >= p31 (zero at x = p, matching the airfoil-geometry formulas); polynomial mean32 line z = sum(c_i x^i) with dz/dx = sum(i c_i x^(i-1)); or sampled (x, z)33 stations read as piecewise-linear camber with constant slope per segment.34- Glauert sine-series coefficients (gamma(theta) = 2U(A0 (1+cos)/sin +35 A1 sin(theta) + A2 sin(2 theta))):36 A0 = alpha - (1/pi) int dz/dx dtheta,37 A1 = (2/pi) int dz/dx cos(theta) dtheta,38 A2 = (2/pi) int dz/dx cos(2 theta) dtheta.39- Zero-lift angle: alpha_L0 = (1/pi) int dz/dx (1 - cos(theta)) dtheta,40 identically -A0(alpha = 0) - A1/2; the identity A0(alpha_L0) = -A1/241 holds exactly, so cl vanishes at the zero-lift angle.42- Section lift: cl = 2 pi A0 + pi A1 = 2 pi (alpha - alpha_L0).43- Quarter-chord pitching moment (aerodynamic center at c/4):44 cm_c4 = (pi/4)(A2 - A1), equivalently cm_le + cl/4 with45 cm_le = -(pi/2)(A0 + A1) + (pi/4) A2. The mistranscribed reading46 -(pi/4)(A1 + A2) is off by (pi/2) A2 and fails the identity; it is47 rejected (it coincides with the classical form only at A2 = 0).48- Center of pressure: x_cp/c = 1/4 - cm_c4/cl, defined only at nonzero lift.49- KNOWN-EXACT closed forms: the parabolic mean line z = 4m x (1 - x) (the50 NACA 4-digit mean line at p = 0.5) gives alpha_L0 = -2m, A1 = 4m, A2 = 0,51 cm_c4 = -pi m exactly; a flat mean line gives A0 = alpha and zero52 everything else. Incompressible potential flow only: no Mach effects, no53 viscosity, no stall.5455## Workflow56571. Choose the camber-line input route: NACA 4-digit mean-line parameters58 (m, p) with glauert_coefficients_naca4, polynomial power-series59 coefficients with glauert_coefficients_poly, or sampled (x, z) camber60 stations spanning [0, 1] with glauert_coefficients_points. All three61 take alpha_rad first and default to n_theta = 40000 quadrature intervals.622. Run the Glauert sine-series decomposition: each route integrates the63 camber slope dz/dx by trapezoid quadrature on the uniform theta grid64 (endpoints included) and returns A0, A1, A2 and the zero-lift angle65 alpha_L0 as a 4-tuple.663. Recover the section lift coefficient with lift_coefficient(alpha_rad,67 alpha_L0_rad) = 2 pi (alpha - alpha_L0); cross-check the identity68 cl = 2 pi A0 + pi A1 on the same coefficients.694. Read the quarter-chord pitching-moment coefficient with70 quarter_chord_moment(A1, A2) = (pi/4)(A2 - A1); verify via the71 independent route cm_le + cl/4 when the full series is available.725. Locate the center of pressure with73 center_of_pressure_over_chord(cl, cm_c4) = 1/4 - cm_c4/cl; the function74 raises ValueError at |cl| < 1e-12, where the cp is not defined.756. Confirm the deterministic checks with the contract test76 scripts/test_thin_airfoil_section_theory.py.7778## Worked example7980NACA 2412 mean line (m = 0.02, p = 0.4) at alpha = 4 deg =810.069813170080 rad, the section whose camber line airfoil-geometry also82handles. Real module outputs (trapezoid quadrature, n_theta = 40000):8384- glauert_coefficients_naca4(0.069813170080, 0.02, 0.4): A0 =85 0.065320283700, A1 = 0.081495141601, A2 = 0.013861276465, alpha_L0 =86 -0.036254684420 rad = -2.077240404870 deg, within a few hundredths of a87 degree of the measured 2412 zero-lift angle near -2 deg.88- Zero-lift identity: alpha_L0 = -A0(0) - A1/2 agrees with the direct89 integral to 1.3e-16; A0(alpha_L0) = -0.040747570801 equals -A1/2.90- Section lift: cl = 2 pi (0.069813170080 + 0.036254684420) =91 0.666443984960, matching cl = 2 pi A0 + pi A1 to 7.8e-16; at alpha = 092 the camber alone lifts at cl = 0.227794900467.93- Quarter-chord moment: cm_c4 = (pi/4)(A2 - A1) = -0.053119513461, near the94 familiar measured 2412 cm0.25 of about -0.05; the route cm_le + cl/495 gives the same value to 1.9e-16, while the mistranscribed96 -(pi/4)(A1 + A2) = -0.074892755617 is off by (pi/2) A2 = +0.021773242156.97- Center of pressure: x_cp/c = 1/4 - cm_c4/cl = 0.329705893759: the cp sits98 at 0.330 chord at 4 deg and moves back toward the quarter chord as cl99 grows.100- Quadrature convergence: A1 at n_theta = 40000 agrees with n_theta =101 1000000 to 3.0e-13, so the default resolution is converged at the kinked102 2412 slope to all printed digits.103104KNOWN-EXACT validation on the parabolic mean line z = 4m x (1 - x), m =1050.04 (polynomial route, coeffs [0.0, 0.16, -0.16]) at 4 deg: exact closed106forms are alpha_L0 = -2m = -0.08 rad, A1 = 4m = 0.16, A2 = 0, cm_c4 =107-pi m = -0.125663706144, cl(4 deg) = 0.941303909067, cl(0) = 4 pi m =1080.502654824574, x_cp/c(4 deg) = 0.383499611478. Quadrature recovers them109to 1e-15, and the NACA 4-digit route at p = 0.5 reproduces the parabola110exactly (A1 = 0.160000000000, alpha_L0 = -0.080000000000, cm_c4 =111-0.125663706144). A flat mean line (coeffs [0.0, 0.0]) gives A0 =1120.069813170080 = alpha with A1 = A2 = alpha_L0 = cm_c4 = 0.113114Sampled camber stations: a 4001-station sample of the parabola gives115alpha_L0 = -0.079999658257 (3.4e-7 from -2m) and A1 = 0.159999318515116(6.8e-7 from 4m); a 4001-station sample of the 2412 mean line gives117alpha_L0 = -0.036254564543 rad and cm_c4 = -0.053119329442, within 1.2e-7118and 1.8e-7 of the analytic route respectively.119120## Verification121122- glauert_coefficients_naca4(0.069813170080, 0.02, 0.4) returns A0 =123 0.065320283700, A1 = 0.081495141601, A2 = 0.013861276465, alpha_L0 =124 -0.036254684420 within 1e-9 of the spec anchors.125- lift_coefficient gives 0.666443984960 at 4 deg and 0.227794900467 at126 alpha = 0; quarter_chord_moment gives -0.053119513461;127 center_of_pressure_over_chord gives 0.329705893759, all within 1e-9.128- Closed forms hold: parabolic alpha_L0 = -2m, A1 = 4m, A2 = 0,129 cm_c4 = -pi m; flat mean line A0 = alpha with the rest zero; the130 identities alpha_L0 = -A0(0) - A1/2, A0(alpha_L0) = -A1/2,131 cl = 2 pi A0 + pi A1 = 2 pi (alpha - alpha_L0) and cm_c4 = cm_le + cl/4132 all hold to 1e-12.133- Convergence: A1 at n_theta = 1000000 differs from n_theta = 40000 by134 3.0e-13 on the 2412 mean line.135- ValueError rejection: m = -0.01 and m = 0.2 (4-digit camber range),136 p = 0.0 and p = 1.0, n_theta below 100 or non-int, empty or non-list137 polynomial coeffs, non-monotone sample stations, sample stations not138 spanning [0, 1], and center_of_pressure_over_chord at |cl| < 1e-12.139- Run the deterministic contract test offline: python3140 scripts/test_thin_airfoil_section_theory.py (33 tests, under 2 s).141142## Related leaves143144- aerodynamics/airfoil/airfoil-geometry: produces the mean camber line145 ordinates and slope consumed here; the NACA 2412 cross-check airfoil is146 shared by both leaves.147- aerodynamics/drag-polars/lift-curve-slope: the finite-wing slope leaf148 that consumes alpha_zero and the section slope as inputs; complementary149 scope, never a duplicate of the camber-line derivation.150- aerodynamics/airfoil/xfoil-analysis: numerical viscous section results151 that use the analytic section solution as their verification anchor.152- aerodynamics/cfd/panel-method: the numerical potential layer beneath the153 closed-form section solution.154155## Pitfalls156157- Transcribing the quarter-chord moment with the wrong sign: the anchor158 rejects cm_c4 = -(pi/4)(A1 + A2), which is off by (pi/2) A2 and fails159 the identity cm_c4 = cm_le + cl/4. The classical relation is160 cm_c4 = (pi/4)(A2 - A1).161- Deriving section data that is input elsewhere: alpha_zero and the162 section slope are inputs to the lift-curve-slope leaf for its finite163 aspect-ratio and sweep work; this leaf derives them from the camber164 line instead. Do not reuse the lift-curve-slope routing tag for this165 leaf's camber-line claim.166- Reading the camber as lift: the flat mean line still lifts at167 cl = 2 pi alpha; only the zero-lift angle, not the slope 2 pi, is set168 by camber.169- Calling the center of pressure at zero lift: x_cp/c = 1/4 - cm_c4/cl170 diverges as cl approaches zero; the module raises ValueError at171 |cl| < 1e-12 rather than return a meaningless station.172- Feeding sample stations that are not strictly increasing or that do not173 span exactly [0, 1]: the piecewise-linear route rejects both, since a174 camber line must cover the full chord once.175- Under-resolving the quadrature: kinked 4-digit slopes converge slowly176 (A1 needs about 40000 intervals to reach 1e-12); the default177 n_theta = 40000 is converged, but n_theta below 100 is rejected.178- Extending beyond the model: no Mach correction, viscosity or stall lives179 in this leaf; it is the incompressible potential-flow section solution180 only.181182## Behavior contract (gate 3)183184Run the deterministic contract test (stdlib unittest, offline):185186 python3 scripts/test_thin_airfoil_section_theory.py187188The 33 tests cover the NACA 2412 worked example at 4 deg (all four Glauert189coefficients, the zero-lift angle in rad and deg, cl at 4 deg and at zero190alpha, the quarter-chord moment, the center of pressure), the closed-form191identities (zero-lift angle from -A0(0) - A1/2, A0(alpha_L0) = -A1/2, the192two cl routes, cm_c4 = cm_le + cl/4, rejection of the A1 + A2193mistranscription), the KNOWN-EXACT parabolic mean line through the194polynomial route and the NACA p = 0.5 crossover, the flat mean line,195quadrature convergence at one million intervals, the 4001-station sampled196camber routes, and ValueError rejection of every non-physical input197listed in the spec. All numeric asserts are order-safe198(assertAlmostEqual with delta or math.isclose); no exact float equality199on computed sums.200201## Compliance202203- NACA Report 824 (naca-tr-824) frames the thin-airfoil theory context as204 US government work in the public domain; the relations above are205 standard engineering methodology from Anderson and Katz and Plotkin,206 summary-only per standards-map.yaml, never reproduced verbatim.207- compliance: STANDARDS-REF, gated: false.