Skip to documentation
DocumentationAll documentsEnglish

NACA456(1)

NAME

naca456 - generate BRL-CAD wing geometry from NACA 4-, 5-, and 6-series airfoils

On this page

SYNOPSIS

naca456 [-m _bot|brep_] [-a _code_] [-A _code_] [-s _length_] [-r _length_]
        [-t _length_] [-w _degrees_] [-d _degrees_] [-T _degrees_]
        [-S _count_] [-c _count_] [--wing _right|left|pair_]
        [-f] [-o _file.g_] [-n _name_] [options]
naca456 --demo-file _file.g_
naca456 --airfoil _code_ --section-file _file.tsv_

DESCRIPTION

naca456 creates right, left, or paired wing geometry in a BRL-CAD .g database using NACA airfoil section definitions. Each wing is a semi-span model and may be output as a closed Bag of Triangles (BoT) mesh or a boundary representation (BREP). A single wing is written as a solid plus a region comb; a pair also receives a top-level combination containing both wing regions.

The implemented section math covers classic 4-digit NACA airfoils, 5-digit mean-line sections, 5-digit reflex mean-line sections, and the NACA 6/6A families covered by the public-domain NACA456 reference implementation from Public Domain Aeronautical Software:

https://www.pdas.com/naca456download.html
Note
the generated models are intended for procedural geometry, rendering, inspection, and BRL-CAD workflow testing. They are not validated for aircraft engineering design, flight hardware development, aerodynamic or structural performance prediction, certification, or any other safety-critical flight use.

SUPPORTED AIRFOILS

The --airfoil and --tip-airfoil options accept these NACA designations:

  • Four-digit sections such as 0012, 2412, and 4415.

  • Five-digit sections such as 23012.

  • Five-digit reflex sections such as 23112.

  • Six-series sections in the 63, 64, 65, 66, and 67 families, such as 63-215, 63215, and 65-210.

  • Six-A-series sections in the 63A, 64A, and 65A families, such as 64A210.

The parser ignores whitespace and hyphens and accepts an optional NACA prefix. For example, NACA 63-215, 63-215, and 63215 are equivalent.

For 5-digit sections the first digit sets design lift coefficient, the second digit sets the camber-position family, the third digit selects normal (0) or reflex (1) mean-line behavior, and the last two digits set thickness percent. The supported camber-position families are those tabulated by the NACA456 reference equations: 5, 10, 15, 20, and 25 percent chord for normal 5-digit sections, and 10, 15, 20, and 25 percent chord for reflex sections.

For 6-series sections the first two characters select the profile family, the next digit is design lift coefficient in tenths, and the final two digits are thickness percent. The --six-a option controls the loading parameter a for ordinary 6-series mean lines. 6A sections use the modified 6-series mean line behavior from NACA456, where a is fixed at 0.8.

OPTIONS

-h, -?, --help

Print option help and exit.

-o file.g, --output file.g

Write the selected wing geometry to file.g. The default is naca456-wing.g.

-n name, --name name

Use name as the base object name. The solid is written as name`.bot` or name`.brep`, and the region is written as name`.r`. The default is naca456_wing. For a pair, the solids and regions instead use name`right` and _name`left` as their bases, and the top-level combination is named _name.

--wing right|left|pair

Select which wing geometry to generate. right, the default, extends from the root into positive model Y. left is its exact reflection about the plane Y = --y-offset and extends into negative Y relative to that plane. pair generates both reflected wings and places their regions in one combination. Sweep, dihedral, twist, and advanced tip geometry are reflected consistently; positive dihedral therefore raises both tips.

-a code, --airfoil code

Set the root airfoil. The default is 2412.

-A code, --tip-airfoil code

Set the tip airfoil. If omitted, the root airfoil is used at the tip. When different root and tip airfoils are supplied, naca456 samples both sections with the same chordwise parameterization and linearly interpolates their section coordinates along the span. This supports interpolation across different supported NACA families when the generated section topology remains compatible.

-m bot|brep, --mode bot|brep

Select output geometry. The default is bot.

--brep-surface ruled|smooth

Select the BREP side-surface construction mode. ruled is the default and creates local bilinear ruled NURBS patches for each span/chord cell. smooth creates bicubic Hermite NURBS patches for each span/chord cell, using shared cubic edge curves and the same explicit trim topology and IsValid()/ IsSolid() checks.

--tip-style rounded|flat

Select the wing-tip closure style. rounded is the default and creates an elliptical planform-style closure beyond the nominal tip section. flat uses the historical planar cap at the final section. With rounded, the requested tip airfoil and tip chord describe the shoulder section where the rounded closure begins; --semi-span and --full-span still measure to the outermost rounded closure. With flat, the requested tip section is placed directly at the semi-span station.

--tip-specification file.json

Read an advanced versioned JSON tip specification. This option is mutually exclusive with --tip-style. Version 1 supports rounded, flat, raked, hoerner, winglet, and blended_winglet styles.

-s length, --semi-span length

Set the root-to-tip semi-span length of each generated wing. The default is 1000.

--full-span length

Set the full aircraft span. Each generated wing uses half this value as its semi-span. This option is mutually exclusive with --semi-span.

-r length, --root-chord length

Set the root chord length. The default is 250.

-t length, --tip-chord length

Set the tip chord length. The default is 125.

-w degrees, --sweep-angle degrees

Set the leading-edge sweep angle in degrees. Positive values sweep the tip back in the model X direction. Internally this is resolved to a tip leading-edge X offset using tan(angle) * semi-span. The default is 0.

--sweep-offset length

Set the tip leading-edge X offset directly. This option is useful when exact model-space placement is more important than an angular planform description. It is mutually exclusive with --sweep-angle.

-d degrees, --dihedral degrees

Set the tip dihedral angle in degrees. The default is 0.

-T degrees, --tip-twist degrees

Set the tip twist angle in degrees. Twist is linearly interpolated from zero at the root to this value at the tip. The rotation pivot is the local quarter-chord point.

-u a, --six-a a

Set the ordinary 6-series mean-line loading parameter. The value must be in the interval [0, 1]. The default is 1.0. This option does not alter the fixed modified mean line used by 6A sections.

-S count, --stations count

Set the number of spanwise stations. The minimum is 2 and the default is 9.

-c count, --samples count

Set the number of chordwise samples per upper or lower surface. The minimum is 5 and the default is 65.

-x offset, --x-offset offset

Set a model-space X translation.

-y offset, --y-offset offset

Set a model-space Y translation.

-z offset, --z-offset offset

Set a model-space Z translation.

-p, --sharp-te

Use the sharp trailing-edge coefficient for 4- and 5-digit thickness forms. The NACA 6-series conformal-mapping thickness forms retain their mapped trailing-edge behavior.

-f, --force

Overwrite an existing output file.

-j, --append

Append objects to an existing output database. Object name collisions are rejected.

--demo-file file.g

Write a 36-airplane sampler database to file.g and exit. Every sample has a left/right wing pair, a cylindrical fuselage, and an EPA nose. The first 24 examples use BoT wings and the final 12 use BREP wings. The sampler covers 4-digit, 5-digit, 5-digit reflex, 6-series, 6A-series, sharp trailing-edge, sweep, taper, dihedral, twist, mixed root/tip section cases, and the supported tip styles. The BREP sampler rows honor --brep-surface. If --tip-style or --tip-specification is supplied, all sampler rows use that explicit tip choice; otherwise the built-in rows use varied tip specifications. The demo database also contains a top-level all combination that unions all generated wing regions.

--section-file file.tsv

Write normalized root airfoil section coordinates to file.tsv and exit. This mode is intended for regression testing and reference comparison against the PDAS NACA456 combined-thickness-and-camber tables. The output columns are airfoil designation, upper X, upper Y, lower X, and lower Y. Use --force to replace an existing section file.

TIP SPECIFICATION JSON

The --tip-specification file uses a strict JSON object schema. Unknown keys are errors, the version field is required, and version 1 is the only version currently accepted. Length values are model-space values in the same units as the other command-line dimensions.

The rounded schema exposes the default rounded closure parameters:

{
  "version": 1,
  "style": "rounded",
  "closure_length": 95.0,
  "terminal_scale": 0.10,
  "center_chord_fraction": 0.5,
  "segments": 7
}

The closure_length field is optional; when omitted, naca456 derives a conservative value from the tip chord and semi-span. terminal_scale is the final cap scale relative to the nominal tip section, center_chord_fraction sets the normalized chord location about which the section shrinks, and segments controls closure refinement.

The raked schema adds a spanwise extension inside the requested semi-span:

{
  "version": 1,
  "style": "raked",
  "extension": 120.0,
  "rake_offset": 80.0,
  "terminal_chord": 70.0,
  "terminal_airfoil": "0008",
  "twist_delta": -1.5,
  "segments": 5,
  "cap_style": "flat"
}

For raked, the nominal tip section is placed at the start of the extension and the terminal section is placed at the semi-span. rake_offset is the additional leading-edge X offset accumulated across the extension. terminal_chord, terminal_airfoil, and twist_delta define the outer section. The initial raked implementation supports cap_style value flat.

The hoerner schema creates a clipped, drooped rounded closure:

{
  "version": 1,
  "style": "hoerner",
  "closure_length": 100.0,
  "tip_cut_angle": 25.0,
  "droop": 12.0,
  "terminal_scale": 0.12,
  "segments": 8
}

closure_length, terminal_scale, and segments control the same closure refinement concepts used by rounded. tip_cut_angle shears the shrinking sections in planform to approximate the Hoerner cut, and droop lowers the outer closure in model Z.

The winglet schema creates an upright tip extension from the nominal tip section:

{
  "version": 1,
  "style": "winglet",
  "height": 220.0,
  "cant_angle": 70.0,
  "toe_angle": 2.0,
  "sweep_offset": 30.0,
  "chord": 75.0,
  "taper": 0.55,
  "airfoil": "0010",
  "twist_delta": -1.5,
  "segments": 8,
  "cap_style": "flat",
  "side": "up"
}

height is the winglet rise, cant_angle controls how strongly the winglet rotates upward from the wing plane, toe_angle yaws the section, and sweep_offset shifts the outer winglet leading edge in X. chord, taper, optional airfoil, and optional twist_delta define the outer winglet section. side is up or down. The current winglet cap support is cap_style value flat.

The blended_winglet schema adds a root blend ahead of the upright winglet:

{
  "version": 1,
  "style": "blended_winglet",
  "height": 220.0,
  "cant_angle": 68.0,
  "toe_angle": 2.0,
  "sweep_offset": 35.0,
  "root_blend_length": 140.0,
  "chord": 80.0,
  "taper": 0.55,
  "airfoil": "0010",
  "twist_delta": -2.0,
  "segments": 8,
  "transition_segments": 5,
  "curvature_profile": "cosine",
  "cap_style": "flat",
  "side": "up"
}

root_blend_length reserves inboard span for the transition from the main wing to the winglet. transition_segments refines that transition, and curvature_profile is cosine or linear.

ALGORITHM

For each requested airfoil, naca456 creates cosine-spaced chordwise sample locations. This concentrates points near the leading edge, where the curvature is highest. It computes mean-line ordinate and slope, computes half-thickness, and offsets the section normal to form upper and lower surface points.

Four-digit thickness uses the conventional polynomial form, with either the standard finite trailing-edge coefficient or the sharp trailing-edge coefficient selected by --sharp-te. Four-digit camber uses the usual two-piece parabolic mean line.

Five-digit normal and reflex mean lines use the tabulated r, k1, and k2/k1 relationships from the NACA456 implementation. Five-digit thickness uses the same polynomial thickness form as the four-digit family.

Six-series and 6A-series thickness is generated from the epsilon/psi conformal mapping data embedded from NACA456. The implementation evaluates the tabulated epsilon and psi functions, scales them for the requested thickness ratio, maps the circle to airfoil coordinates, and interpolates the resulting half-thickness curve at the requested chordwise samples. Ordinary 6-series mean lines use the NACA456 MeanLine6 equations. 6A-series mean lines use the NACA456 modified six-series mean line.

The planform transform is then applied station by station. Chord length, leading-edge sweep offset, dihedral, and twist are linearly interpolated from root to the nominal tip section. Twist is applied around the local quarter chord. The model-space translation options are applied after the local section transform.

The default --tip-style rounded adds an elliptical closure beyond the nominal tip section. The closure progressively scales the tip airfoil outline around mid-chord, giving the planform a rounded wing-tip outline while preserving closed, explicit BoT/BREP topology. Both output modes add refined closure stations and close with a small terminal cap, avoiding the broad planar fan used by a simple pole closure. BREP represents the rounded closure with the same NURBS side-surface mode selected by --brep-surface; BoT writes per-face-vertex normals for smoother display while preserving the refined mesh geometry. The fallback --tip-style flat places the final section at the semi-span location and closes it with a planar triangulated cap.

In BoT mode, adjacent station outlines are triangulated into a closed mesh. The root cap and flat tip caps are triangulated as constrained polygons rather than centroid fans, avoiding poor triangles on concave or sharply cusped airfoil outlines. Rounded tips use the same side triangulation and close to a small terminal cap. The generated mesh is checked for finite coordinates, valid indices, manifoldness, orientation, closure, self-intersection, and triangle quality before it is written as a solid BoT. BoT output includes surface normals for smoother rounded-tip display; root and terminal cap normals are kept flat.

In BREP mode, every outline vertex is represented explicitly. Chordwise outline edges and spanwise edges are shared by adjacent faces. The side skin is represented as local bilinear ruled NURBS patches between neighboring spanwise stations and chordwise outline edges. Local patches avoid the span-curve overshoot that can occur when a single interpolated strip crosses a sharp wing-tip transition.

Root caps and flat tip caps are represented by triangulated planar faces; rounded tips use additional NURBS side/closure bands down to a small terminal triangulated cap. The BREP is standardized, compacted, and checked with OpenNURBS IsValid() and IsSolid(), plus additional libbrep quality checks for duplicate vertices, zero-length edges and trims, edge trim pairing, face aspect ratio, and conservative self-intersection risk, before it is written.

With --brep-surface smooth, the side skin uses bicubic Hermite NURBS patches for each station-to-station, chord-to-chord cell. Tangents are estimated from neighboring spanwise and chordwise samples, then limited against each local edge direction and length to avoid overshoot at sharp tip transitions. The patch boundary curves are shared as explicit BREP edges. This produces smoother local side-surface geometry while preserving explicit loop and trim topology.

When either the root or tip section has a collapsed trailing edge, the lower trailing-edge duplicate is omitted for all interpolated stations. This keeps the spanwise topology stable and avoids zero-length BREP edges in mixed root/tip cases.

METADATA

Each generated solid and region receives naca456:: attributes recording the inputs used to create it. These include generator name, metadata version, algorithm source, geometry mode, wing side, BREP surface mode, root and tip airfoil designations, tip style, semi-span, full span, root and tip chord, sweep offset, sweep angle, dihedral, tip twist, 6-series loading parameter, station/sample counts, trailing-edge mode, and model-space offsets. When a JSON tip specification is used, the compact JSON payload is recorded; when it comes from --tip-specification, the filename is recorded as well.

For paired output, the top-level combination records the pair configuration, the left and right region names, and the semi-span and full-span values. Its two solids and regions each record their own left or right wing side.

For example:

mged wing.g "attr get wing_2412.r naca456::root_airfoil"
mged wing.g "attr get wing_2412.r naca456::geometry_mode"
mged wing.g "attr get wing_2412.r naca456::brep_surface"
mged wing.g "attr get wing_2412.r naca456::tip_style"

The attributes are intended to make generated models auditable. They are not a parametric regeneration contract; future versions may add metadata fields or change BREP construction details.

LIMITATIONS

naca456 is a geometric airfoil and wing-shape generator. It does not perform aerodynamic analysis, structural analysis, aeroelastic analysis, certification checks, or optimization.

Each generated wing is a semi-span solid. A pair is two independently capped solids that meet at the center plane; it is not a fused solid or a wing-body blend. The tool does not currently generate control surfaces, flaps, slats, spars, ribs, skins with physical thickness, fuel volumes, fasteners, or manufacturing features.

The simple --tip-style option intentionally exposes only the default rounded closure and flat fallback. More parameterized tips are available through --tip-specification. The Hoerner and winglet styles are geometric approximations intended for procedural model generation; they are not a substitute for aerodynamic design, load analysis, or manufacturer-specific tip-device geometry.

The BREP output is checked with OpenNURBS IsValid() and IsSolid(), but it is not a general CAD healing pipeline. Downstream Boolean operations may still be sensitive to extreme parameter combinations, very thin sections, aggressive twist, or highly tapered planforms.

The airfoil definitions are mathematical NACA sections produced from the referenced NACA456 equations and tables. They are not guaranteed to match any particular manufactured, wind-tunnel, or proprietary derivative airfoil.

All length inputs are BRL-CAD model-space values. They are intentionally unitless at the command line: a value of 1000 means 1000 database model units, whatever unit system the receiving .g database is interpreted to use. The generated shape uses a semi-span per wing; use --semi-span to specify that length directly, or --full-span when starting from a full aircraft span. Sweep is available either as --sweep-angle for an aerodynamic planform description or as --sweep-offset for exact model-space placement.

ALGORITHM SOURCES

The section mathematics are implemented from the public-domain NACA456 program by Ralph Carmichael, distributed by Public Domain Aeronautical Software (PDAS):

https://www.pdas.com/naca456download.html

The BRL-CAD implementation references the NACA456 source files nacax.f90, epspsi.f90, and splprocs.f90. In particular, it uses the NACA456 MeanLine3, MeanLine3Reflex, MeanLine6, MeanLine6M, ScaleFactor, and six-series epsilon/psi table logic as the basis for the local C++ implementation.

The NACA456 source package and PDAS reference page identify these principal references for the underlying airfoil coordinate algorithms and data:

  • Carmichael, Ralph L., "Algorithm for Calculating Coordinates of Cambered NACA Airfoils At Specified Chord Locations," AIAA Paper 2001-5235, November 2001.

  • Ladson, Charles L., and Brooks, Cuyler W., Jr., "Development of a Computer Program to Obtain Ordinates for NACA 6- and 6A-Series Airfoils," NASA Technical Memorandum X-3069, September 1974.

  • Ladson, Charles L., and Brooks, Cuyler W., Jr., "Development of a Computer Program to Obtain Ordinates for NACA 4-Digit, 4-Digit Modified, 5-Digit, and 16-Series Airfoils," NASA Technical Memorandum X-3284, November 1975.

  • Ladson, Charles L., Brooks, Cuyler W., Jr., Hill, Acquilla S., and Sproles, Darrell W., "Computer Program to Obtain Ordinates for NACA Airfoils," NASA Technical Memorandum 4741, December 1996.

  • Abbott, Ira H., and von Doenhoff, Albert E., Theory of Airfoil Sections, Dover, 1952.

  • Abbott, Ira H., von Doenhoff, Albert E., and Stivers, Louis S., "Summary of Airfoil Data," NACA Report 824, 1945.

  • Jacobs, Eastman N., and Pinkerton, Robert M., "Tests in the Variable-density Wind Tunnel of Related Airfoils Having the Maximum Camber Unusually Far Forward," NACA Report 537, 1935.

  • Loftin, Laurence K., Jr., "Theoretical and Experimental Data for a Number of NACA 6A-series Airfoil Sections," NACA Report 903, 1948.

The broader PDAS bibliography is maintained at:

https://www.pdas.com/naca456refs.html

EXAMPLES

Example 1. Paired airplane wings
naca456 --mode bot --force --output airplane-wings.g --name main_wing \
  --wing pair --airfoil 2412 --full-span 2000 --root-chord 250 \
  --tip-chord 125 --sweep-angle 4.6 --dihedral 5 --tip-twist -2

mged airplane-wings.g "l main_wing"

Generates matching right and left wings as main_wing_right.r and main_wing_left.r. The top-level main_wing combination contains both, so it can be drawn or referenced as one airplane wing assembly.

Example 2. Swept, dihedral, tapered BoT wing
naca456 --mode bot --force --output wing.g --name wing_2412 \
  --airfoil 2412 --semi-span 1000 --root-chord 250 --tip-chord 125 \
  --sweep-angle 4.6 --dihedral 5 --tip-twist -2 --stations 9 --samples 65

Generates the default right-side closed Bag-of-Triangles half-wing from a NACA 2412 section with 4.6 degrees of leading-edge sweep, 5 degrees of dihedral, and -2 degrees of tip washout into wing.g as the solid wing_2412.bot and region wing_2412.r, ready to be raytraced with rt(1) or edited in mged(1).

Example 3. BREP wing blending a 5-digit root into a 6-series tip
naca456 --mode brep --force --output wing-brep.g --name wing_brep \
  --airfoil 23012 --tip-airfoil 65-210 --full-span 2000 \
  --root-chord 280 --tip-chord 110 --sweep-offset 120 \
  --dihedral 4 --tip-twist -3 --stations 8 --samples 29

Produces a NURBS boundary-representation wing whose sections are linearly interpolated from a NACA 23012 root to a NACA 65-210 tip. The full span is 2000 model units (1000-unit semi-span), and the tip leading edge is placed 120 units aft by direct offset rather than by sweep angle.

Example 4. Wing with a JSON-specified raked tip, then inspected in mged
cat > tip-raked.json <<'EOF'
{ "version": 1, "style": "raked", "extension": 120.0, "rake_offset": 80.0,
  "terminal_chord": 70.0, "terminal_airfoil": "0008", "cap_style": "flat" }
EOF

naca456 --mode brep --force --output wing-raked-brep.g \
  --name wing_raked --airfoil 2412 --semi-span 780 \
  --root-chord 230 --tip-chord 110 --sweep-offset 70 \
  --tip-specification tip-raked.json --stations 7 --samples 25

mged wing-raked-brep.g "attr get wing_raked.r naca456::tip_style"

Builds a raked wing-tip extension described by an external versioned JSON tip specification, then reads back the naca456::tip_style attribute that naca456 records on every generated region for auditability.

Example 5. Built-in airplane sampler database
naca456 --demo-file naca456-demo.g
mged naca456-demo.g "l all"

Writes a 36-airplane sampler (24 with BoT wings and 12 with BREP wings) covering the 4-digit, 5-digit, 5-digit reflex, 6-series, and 6A-series families. Each sample combines a paired wing set with a cylindrical fuselage and EPA nose, and the top-level all combination collects all 36 airplane assemblies.

DIAGNOSTICS

naca456 exits with a nonzero status if option parsing fails, if the requested NACA code is unsupported, if the output database cannot be opened, if appending would overwrite an existing object name, if BoT mesh validation fails, or if BREP validation or solid classification fails.

SEE ALSO

brlcad(1), mged(1), rt(1), libwdb(3)

AUTHOR

BRL-CAD Team

This software is Copyright (c) 1989-2026 by the United States Government as represented by U.S. Army Research Laboratory.

BUG REPORTS

Reports of bugs or problems should be submitted via electronic mail to devs@brlcad.org