Canard Sizing (vehicle-design/sizing/canard-sizing)
Use when the task is sizing the forward canard surface of a
canard-configured or three-surface aircraft: the canard area needed
for a target canard volume coefficient, the trim lift share carried
by the canard in steady level flight, the canard and wing lift
coefficients at the trim condition, and the stall precedence check
that the canard stalls before the wing so the nose drops rather than
pitches up. This leaf implements the conceptual sizing loop in pure
Python, stdlib only. It pairs with vehicle-design/sizing/tail-sizing,
which owns the conventional aft empennage volume coefficients V_h and
V_v, and with flight-mechanics/stability-control/longitudinal-stability
for the neutral point and static margin that frame canard trim.
Domain quick reference
- Canard volume coefficient: V_c = S_c * L_c / (S * cbar), with S_c
the canard area (m2), L_c the canard arm (m) from the wing
aerodynamic center to the canard aerodynamic center, S the wing
reference area (m2) and cbar the wing mean aerodynamic chord (m).
The convention mirrors V_h for a horizontal tail, but the surface
lies forward of the wing.
- Required canard area: S_c = V_c_target * S * cbar / L_c. A canard
configuration that must trim at a forward center of gravity with a
high nose-down pitching moment needs a large V_c target (0.35 to
0.6 typical at conceptual level).
- Geometry convention: x positive aft, origin at the wing aerodynamic
center, canard forward of the wing (x_c < x_w = 0) and the center
of gravity between them (x_c < x_cg < x_w).
- Trim lift share: f_c = (x_w - x_cg) / (x_w - x_c), the fraction of
weight carried by the canard from the moment balance about the
center of gravity with lift up positive. Moving the CG aft lowers
the canard share.
- Trim lift coefficients: L_c = f_c * weight, L_w = weight - L_c,
then Cl_c = L_c / (q * S_c) and Cl_w = L_w / (q * S_w) at the
dynamic pressure q.
- Stall precedence margins: margin_c = Cl_max_c / Cl_c and margin_w =
Cl_max_w / Cl_w. The surface with the smaller margin reaches its
maximum lift first. A canard layout is pitch-safe only when the
canard stalls first, so the nose drops instead of pitching up.
- Units are SI throughout: m, m2, N, Pa, kg/m3, dimensionless
coefficients.
- FAR 25 and CS 25 flight characteristics requirements frame the
pitch-up avoidance intent; the relations above are standard
engineering methodology, summary-only.
Workflow
- Fix the wing reference quantities (wing_area S, wing_mac cbar) and
the canard arm from the layout; pick the target canard volume
coefficient for the configuration and the CG envelope.
- Size the surface: required_canard_area gives the canard area for
the target coefficient, or run size_canard for the area plus the
echoed coefficient.
- Verify the chosen area with canard_volume_coefficient, which must
return the target (round trip).
- Compute the trim lift share with canard_lift_share at the CG
station of interest; the geometry must satisfy x_c < x_cg < x_w.
- Resolve the trim condition with trim_lift_coefficients from the
weight and dynamic pressure to get the canard and wing lift
forces and coefficients.
- Run the stall precedence check with stall_precedence on the trim
coefficients and the surface maximum lift coefficients. The
verdict must read canard-stalls-first for the nose to drop rather
than pitch up at the stall.
- Sweep the CG envelope: at the aft CG the canard share falls and
the verdict can flip to wing-stalls-first, which flags the pitch
up risk and demands a larger V_c or a CG limit.
- Confirm the deterministic checks with the contract test
scripts/test_canard_sizing.py.
Worked example
Canard-configured light aircraft: wing area S = 30 m2, wing MAC cbar
= 2.8 m, canard arm L_c = 9 m, target V_c = 0.45. Forward CG case
x_cg = -3 m, canard x_c = -9 m, wing x_w = 0 m. Weight = 1200 * g0 N
with g0 = 9.80665 m/s2; dynamic pressure q = 0.5 * 1.225 * 45^2 =
1240.3 Pa. Canard Cl_max = 1.7, wing Cl_max = 1.5.
- Required area: S_c = 0.45 * 30 * 2.8 / 9 = 4.2 m2. Round trip:
V_c = 4.2 * 9 / (30 * 2.8) = 0.45.
- Forward CG trim share: f_c = (0 - (-3)) / (0 - (-9)) = 3/9 =
0.3333.
- Trim forces and coefficients: L_c = 3922.7 N, L_w = 7845.3 N,
Cl_c = 3922.7 / (1240.3 * 4.2) = 0.7526, Cl_w = 7845.3 / (1240.3 *
- = 0.2108.
- Stall precedence: margin_c = 1.7 / 0.7526 = 2.259 against
margin_w = 1.5 / 0.2108 = 7.116, verdict canard-stalls-first.
- Aft CG case x_cg = -1 m: f_c = 1/9 = 0.1111, Cl_c = 0.2510, Cl_w =
0.2811, margin_c = 6.77 against margin_w = 5.34, verdict
wing-stalls-first, which demonstrates the pitch-up risk when the
CG moves aft.
Pitfalls
- Declaring pitch safety without the stall precedence check: a
canard layout is only pitch-safe when the canard stalls first
(margin_c < margin_w); in the worked example the aft CG case flips
to wing-stalls-first, so a fixed canard area is not safe across
the whole CG envelope.
- Sizing the area and skipping the CG sweep: the trim share f_c =
(x_w - x_cg) / (x_w - x_c) falls as the CG moves aft (0.3333 to
0.1111 in the worked example), so the surface must be checked at
the aft CG where the pitch-up risk lives.
- Violating the geometry convention: the layout must satisfy
x_c < x_cg < x_w with x positive aft; a CG station outside that
ordering is rejected and the share formula loses meaning.
- Comparing margins across the wrong surface: the surface with the
SMALLER margin (Cl_max / Cl) reaches its maximum lift first, so
canard-stalls-first needs margin_c < margin_w, not the larger
coefficient.
- Forgetting the coefficient depends on dynamic pressure: Cl_c =
L_c / (q * S_c) and Cl_w = L_w / (q * S_w) use the trim q; the
stall precedence verdict changes if q changes, so the check
belongs at the actual trim condition.
- Treating the canard like a tail: the volume coefficient mirrors
V_h but the surface lies FORWARD of the wing and carries upload
(positive trim lift), which is the opposite of the download a
conventional tail usually carries.
Verification
- Confirm required_canard_area(0.45, 9, 30, 2.8) returns 4.2 m2 and
canard_volume_coefficient(4.2, 9, 30, 2.8) recovers 0.45.
- Confirm canard_lift_share(-3, 0, -9) returns 0.3333 and
canard_lift_share(-1, 0, -9) returns 0.1111.
- Confirm trim_lift_coefficients at the worked example returns the
anchor values above, and that the canard and wing lift forces sum
to the weight.
- Confirm stall_precedence returns the canard-stalls-first verdict at
the forward CG and wing-stalls-first at the aft CG, with the
margin ratios 2.259/7.116 and 6.77/5.34.
- Confirm every non-positive volume coefficient target, area, arm,
wing reference quantity, dynamic pressure, weight, maximum lift
coefficient and trim lift coefficient raises ValueError, and that
any CG station outside x_c < x_cg < x_w is rejected.
- Run the contract test offline: python3
scripts/test_canard_sizing.py (45 tests, deterministic).
Related leaves
- vehicle-design/sizing/tail-sizing: conventional aft empennage
volume coefficients V_h and V_v, the alternative layout for the
same trim function.
- flight-mechanics/stability-control/longitudinal-stability: the
neutral point and static margin that frame where the canard trim
share must act.
- vehicle-design/sizing/control-surface-sizing: elevators or
control authority on the canard when the surface carries
controls.
- vehicle-design/sizing/wing-planform-sizing: wing reference area
and chord inputs for the canard volume coefficient.
Behavior contract (gate 3)
Run the deterministic contract test (stdlib unittest, offline):
python3 scripts/test_canard_sizing.py
The test covers the worked example anchors (required canard area 4.2
m2 within 1e-6, volume coefficient round trip within 1e-9, trim lift
share 0.3333 at the forward CG and 0.1111 at the aft CG, trim lift
coefficients 0.7526 and 0.2108, stall precedence margin ratios and
both verdicts), the coefficient scaling laws and lift split identity,
the size_canard convenience wrapper, and ValueError rejection of
non-positive inputs and of CG stations outside x_c < x_cg < x_w.
Compliance
- Standards referenced, not reproduced: FAR 25 and CS 25 flight
characteristics requirements frame the pitch-up avoidance intent
for canard configurations; the canard sizing relations above are
standard engineering methodology, summary-only per
standards-map.yaml.
- compliance: STANDARDS-REF, gated: false.
1---2name: canard-sizing3description: Use when you must size the canard of a canard-configured aircraft: compute the required canard area for a target canard volume coefficient from the canard arm and the wing reference geometry, derive the trim lift share carried by the forward canard from the longitudinal geometry, resolve the canard and wing lift coefficients at the trim condition, and run the stall precedence check that the canard reaches maximum lift before the wing so the nose drops instead of pitching up. Produces the canard area, trim lift share, trim lift coefficients, and the stall precedence verdict. Trigger: canard sizing, canard volume coefficient, canard area, forward wing, stall precedence, canard configuration, trim lift share.4license: Apache-2.05---67# Canard Sizing (vehicle-design/sizing/canard-sizing)89Use when the task is sizing the forward canard surface of a10canard-configured or three-surface aircraft: the canard area needed11for a target canard volume coefficient, the trim lift share carried12by the canard in steady level flight, the canard and wing lift13coefficients at the trim condition, and the stall precedence check14that the canard stalls before the wing so the nose drops rather than15pitches up. This leaf implements the conceptual sizing loop in pure16Python, stdlib only. It pairs with vehicle-design/sizing/tail-sizing,17which owns the conventional aft empennage volume coefficients V_h and18V_v, and with flight-mechanics/stability-control/longitudinal-stability19for the neutral point and static margin that frame canard trim.2021## Domain quick reference2223- Canard volume coefficient: V_c = S_c * L_c / (S * cbar), with S_c24 the canard area (m2), L_c the canard arm (m) from the wing25 aerodynamic center to the canard aerodynamic center, S the wing26 reference area (m2) and cbar the wing mean aerodynamic chord (m).27 The convention mirrors V_h for a horizontal tail, but the surface28 lies forward of the wing.29- Required canard area: S_c = V_c_target * S * cbar / L_c. A canard30 configuration that must trim at a forward center of gravity with a31 high nose-down pitching moment needs a large V_c target (0.35 to32 0.6 typical at conceptual level).33- Geometry convention: x positive aft, origin at the wing aerodynamic34 center, canard forward of the wing (x_c < x_w = 0) and the center35 of gravity between them (x_c < x_cg < x_w).36- Trim lift share: f_c = (x_w - x_cg) / (x_w - x_c), the fraction of37 weight carried by the canard from the moment balance about the38 center of gravity with lift up positive. Moving the CG aft lowers39 the canard share.40- Trim lift coefficients: L_c = f_c * weight, L_w = weight - L_c,41 then Cl_c = L_c / (q * S_c) and Cl_w = L_w / (q * S_w) at the42 dynamic pressure q.43- Stall precedence margins: margin_c = Cl_max_c / Cl_c and margin_w =44 Cl_max_w / Cl_w. The surface with the smaller margin reaches its45 maximum lift first. A canard layout is pitch-safe only when the46 canard stalls first, so the nose drops instead of pitching up.47- Units are SI throughout: m, m2, N, Pa, kg/m3, dimensionless48 coefficients.49- FAR 25 and CS 25 flight characteristics requirements frame the50 pitch-up avoidance intent; the relations above are standard51 engineering methodology, summary-only.5253## Workflow54551. Fix the wing reference quantities (wing_area S, wing_mac cbar) and56 the canard arm from the layout; pick the target canard volume57 coefficient for the configuration and the CG envelope.582. Size the surface: required_canard_area gives the canard area for59 the target coefficient, or run size_canard for the area plus the60 echoed coefficient.613. Verify the chosen area with canard_volume_coefficient, which must62 return the target (round trip).634. Compute the trim lift share with canard_lift_share at the CG64 station of interest; the geometry must satisfy x_c < x_cg < x_w.655. Resolve the trim condition with trim_lift_coefficients from the66 weight and dynamic pressure to get the canard and wing lift67 forces and coefficients.686. Run the stall precedence check with stall_precedence on the trim69 coefficients and the surface maximum lift coefficients. The70 verdict must read canard-stalls-first for the nose to drop rather71 than pitch up at the stall.727. Sweep the CG envelope: at the aft CG the canard share falls and73 the verdict can flip to wing-stalls-first, which flags the pitch74 up risk and demands a larger V_c or a CG limit.758. Confirm the deterministic checks with the contract test76 scripts/test_canard_sizing.py.7778## Worked example7980Canard-configured light aircraft: wing area S = 30 m2, wing MAC cbar81= 2.8 m, canard arm L_c = 9 m, target V_c = 0.45. Forward CG case82x_cg = -3 m, canard x_c = -9 m, wing x_w = 0 m. Weight = 1200 * g0 N83with g0 = 9.80665 m/s2; dynamic pressure q = 0.5 * 1.225 * 45^2 =841240.3 Pa. Canard Cl_max = 1.7, wing Cl_max = 1.5.8586- Required area: S_c = 0.45 * 30 * 2.8 / 9 = 4.2 m2. Round trip:87 V_c = 4.2 * 9 / (30 * 2.8) = 0.45.88- Forward CG trim share: f_c = (0 - (-3)) / (0 - (-9)) = 3/9 =89 0.3333.90- Trim forces and coefficients: L_c = 3922.7 N, L_w = 7845.3 N,91 Cl_c = 3922.7 / (1240.3 * 4.2) = 0.7526, Cl_w = 7845.3 / (1240.3 *92 30) = 0.2108.93- Stall precedence: margin_c = 1.7 / 0.7526 = 2.259 against94 margin_w = 1.5 / 0.2108 = 7.116, verdict canard-stalls-first.95- Aft CG case x_cg = -1 m: f_c = 1/9 = 0.1111, Cl_c = 0.2510, Cl_w =96 0.2811, margin_c = 6.77 against margin_w = 5.34, verdict97 wing-stalls-first, which demonstrates the pitch-up risk when the98 CG moves aft.99100101## Pitfalls102103- Declaring pitch safety without the stall precedence check: a104 canard layout is only pitch-safe when the canard stalls first105 (margin_c < margin_w); in the worked example the aft CG case flips106 to wing-stalls-first, so a fixed canard area is not safe across107 the whole CG envelope.108- Sizing the area and skipping the CG sweep: the trim share f_c =109 (x_w - x_cg) / (x_w - x_c) falls as the CG moves aft (0.3333 to110 0.1111 in the worked example), so the surface must be checked at111 the aft CG where the pitch-up risk lives.112- Violating the geometry convention: the layout must satisfy113 x_c < x_cg < x_w with x positive aft; a CG station outside that114 ordering is rejected and the share formula loses meaning.115- Comparing margins across the wrong surface: the surface with the116 SMALLER margin (Cl_max / Cl) reaches its maximum lift first, so117 canard-stalls-first needs margin_c < margin_w, not the larger118 coefficient.119- Forgetting the coefficient depends on dynamic pressure: Cl_c =120 L_c / (q * S_c) and Cl_w = L_w / (q * S_w) use the trim q; the121 stall precedence verdict changes if q changes, so the check122 belongs at the actual trim condition.123- Treating the canard like a tail: the volume coefficient mirrors124 V_h but the surface lies FORWARD of the wing and carries upload125 (positive trim lift), which is the opposite of the download a126 conventional tail usually carries.127## Verification128129- Confirm required_canard_area(0.45, 9, 30, 2.8) returns 4.2 m2 and130 canard_volume_coefficient(4.2, 9, 30, 2.8) recovers 0.45.131- Confirm canard_lift_share(-3, 0, -9) returns 0.3333 and132 canard_lift_share(-1, 0, -9) returns 0.1111.133- Confirm trim_lift_coefficients at the worked example returns the134 anchor values above, and that the canard and wing lift forces sum135 to the weight.136- Confirm stall_precedence returns the canard-stalls-first verdict at137 the forward CG and wing-stalls-first at the aft CG, with the138 margin ratios 2.259/7.116 and 6.77/5.34.139- Confirm every non-positive volume coefficient target, area, arm,140 wing reference quantity, dynamic pressure, weight, maximum lift141 coefficient and trim lift coefficient raises ValueError, and that142 any CG station outside x_c < x_cg < x_w is rejected.143- Run the contract test offline: python3144 scripts/test_canard_sizing.py (45 tests, deterministic).145146## Related leaves147148- vehicle-design/sizing/tail-sizing: conventional aft empennage149 volume coefficients V_h and V_v, the alternative layout for the150 same trim function.151- flight-mechanics/stability-control/longitudinal-stability: the152 neutral point and static margin that frame where the canard trim153 share must act.154- vehicle-design/sizing/control-surface-sizing: elevators or155 control authority on the canard when the surface carries156 controls.157- vehicle-design/sizing/wing-planform-sizing: wing reference area158 and chord inputs for the canard volume coefficient.159160## Behavior contract (gate 3)161162Run the deterministic contract test (stdlib unittest, offline):163164 python3 scripts/test_canard_sizing.py165166The test covers the worked example anchors (required canard area 4.2167m2 within 1e-6, volume coefficient round trip within 1e-9, trim lift168share 0.3333 at the forward CG and 0.1111 at the aft CG, trim lift169coefficients 0.7526 and 0.2108, stall precedence margin ratios and170both verdicts), the coefficient scaling laws and lift split identity,171the size_canard convenience wrapper, and ValueError rejection of172non-positive inputs and of CG stations outside x_c < x_cg < x_w.173174## Compliance175176- Standards referenced, not reproduced: FAR 25 and CS 25 flight177 characteristics requirements frame the pitch-up avoidance intent178 for canard configurations; the canard sizing relations above are179 standard engineering methodology, summary-only per180 standards-map.yaml.181- compliance: STANDARDS-REF, gated: false.