Rotorcraft Forward-Flight Flapping (flight-mechanics/performance/rotorcraft-forward-flight-flapping)
Use when the task is the steady first-harmonic flapping equilibrium of a
helicopter main rotor blade in forward flight: the tip-path-plane tilt
that the idealized centrally hinged, untwisted blade settles into under
uniform inflow at a given advance ratio. This leaf implements the
classical harmonic balance of the flap equation (Johnson, Helicopter
Theory ch. 4 and Leishman, Principles of Helicopter Aerodynamics ch. 4,
paraphrased, never reproduced) in pure Python, stdlib only,
deterministic. It is the forward-flight extension of
flight-mechanics/performance/rotorcraft-blade-flapping-dynamics, which
owns only the hover-state Lock number, hover coning angle and flap
frequency ratio; the forward-flight flap equilibrium, tip-path-plane
tilt and first-harmonic content live here.
Domain quick reference
- Blade element velocities in the hub plane frame: u_T = x + musin(psi)
(tangential, x = r/R) and u_P = lambda + xbeta' + mubetacos(psi)
(perpendicular), with psi measured from the downwind blade position,
advancing side at psi = pi/2.
- First-harmonic flap ansatz: beta(psi) = a0 + a1scos(psi) +
b1ssin(psi), with a0 the coning angle, a1s the longitudinal (cos)
component and b1s the lateral (sin) component.
- Flap equation with nu = 1 (central hinge): beta'' + beta =
(gamma/2)*M(psi). The steady part fixes a0 (centrifugal balance); the
1/rev part vanishes identically at resonance, so equilibrium nulls the
cos and sin projections of the aerodynamic flap moment M(psi).
- Closed forms (exact solution of the 3 by 3 harmonic-balance system):
a0 = (gamma/2)(theta0(1 + mu^2)/4 - lambda/3),
a1s = -4mu(2theta0/3 - lambda/2)/(1 - mu^2/2),
b1s = -(4mu/3)*a0/(1 + mu^2/2).
- a1s is gamma-free: the aerodynamic forcing and damping both scale with
the Lock number and cancel in the 1/rev cos balance. b1s carries gamma
through the coning coupling to a0.
- Hover limit: mu = 0 gives a0 equal to the hover leaf closed form
0.5gamma(theta0/4 - lambda/3), and a1s = b1s = 0 exactly.
- Sign convention: a1s < 0 means the tip-path plane tilts aft (the
flapping-back direction of forward flight); b1s < 0 means the
advancing blade (psi = pi/2) tip sits below the coning plane.
- Scope: 0 <= mu < 1 (singular at mu = 1, reverse flow out of scope),
lambda > 0 (downward-positive convention), theta0 > 0, centrally
hinged, first harmonic only, small angles.
- Units are radians for the angle inputs and the _rad outputs; the
_deg outputs are the _rad values times 180/pi.
- FAR-29 frames the transport-category rotorcraft certification
context for rotor loads; the relations above are standard engineering
methodology, summary-only.
Workflow
- Fix the operating point: advance ratio mu, uniform inflow ratio
lambda, collective pitch theta0 and blade Lock number gamma (the
same gamma the hover sibling computes from blade geometry).
- Compute the forward-flight coning angle with forward_coning_angle
and compare it against the hover coning value at the same theta0 and
lambda (the theta0*mu^2/4 dynamic-pressure gain).
- Compute the longitudinal flapping angle with
longitudinal_flapping_angle and read the tip-path-plane aft tilt (no
gamma argument: it cancels in the 1/rev balance).
- Compute the lateral flapping angle with lateral_flapping_angle and
confirm the coning-coupling identity against forward_coning_angle.
- Run forward_flap_summary for the one-call dict with all six
documented keys in radians and degrees.
- Check the inflow sensitivity of the tip-path-plane tilt: raising
lambda relaxes the aft tilt, lowering it steepens the aft tilt, and
the two-point differences are exact closed-form linear slopes.
- Confirm the flapping angles grow in magnitude with advance ratio mu
over the operating range and stay inside the published few-degree
band.
- Confirm the deterministic checks with the contract test
scripts/test_rotorcraft_forward_flight_flapping.py.
Worked example
Cruise case: advance ratio mu = 0.3, uniform inflow ratio lambda = 0.06,
collective theta0 = 0.14 rad, Lock number gamma = 6.0 (a light-to-medium
blade in the hover sibling's gamma 5-8 and lambda 0.05-0.08 band). Real
module outputs:
- forward_coning_angle(0.3, 0.06, 0.14, 6.0) = 0.05445 rad = 3.11976
deg, 21 percent above the hover value 0.045 rad at the same theta0
and lambda.
- longitudinal_flapping_angle(0.3, 0.06, 0.14) = -0.07958 rad = -4.5597
deg: the tip-path plane tilts aft by about 4.56 deg. The magnitude
grows with mu: 1.459 deg at mu = 0.1, 2.962 deg at mu = 0.2, 4.560 deg
at mu = 0.3, 5.412 deg at mu = 0.35.
- lateral_flapping_angle(0.3, 0.06, 0.14, 6.0) = -0.02084 rad = -1.1942
deg: the advancing side sits about 1.19 deg below the coning plane,
also growing with mu.
- Inflow sensitivity at the worked point: raising lambda to 0.08
relaxes the aft tilt to a1s = -3.8397 deg; lowering it to 0.05
steepens the aft tilt to -4.9196 deg.
- Hover-limit anchor at the same theta0, lambda, gamma: mu = 0.0 gives
a0 = 0.045 rad, a1s = 0.0 and b1s = 0.0 exactly.
- forward_flap_summary(0.3, 0.06, 0.14, 6.0) returns the six-key dict:
coning_angle_rad 0.05445, coning_angle_deg 3.11976,
longitudinal_flapping_rad -0.07958, longitudinal_flapping_deg
-4.5597, lateral_flapping_rad -0.02084, lateral_flapping_deg -1.1942.
Verification
- Confirm forward_coning_angle(0.3, 0.06, 0.14, 6.0) matches the worked
value and that mu = 0.0 reproduces the hover sibling closed form
0.5gamma(theta0/4 - lambda/3).
- Confirm longitudinal_flapping_angle(0.3, 0.06, 0.14) matches the
worked value, is exactly 0.0 at mu = 0.0, and is exactly 0.0 at the
collective-inflow balance theta0 = 3*lambda/4.
- Confirm lateral_flapping_angle satisfies the coning-coupling identity
-(4*mu/3)*forward_coning_angle/(1 + mu^2/2) at the worked point and at
a second point.
- Confirm the two-point inflow differences match the exact closed-form
slopes 2mu/(1 - mu^2/2), -gamma/6 and (2mu*gamma/9)/(1 + mu^2/2).
- Confirm |a1s| and |b1s| strictly increase over mu = 0.1, 0.2, 0.3,
0.35 at fixed lambda and theta0.
- Confirm forward_flap_summary returns exactly the six documented keys
and each matches the corresponding component function.
- Confirm ValueError rejection of mu < 0, mu >= 1, lambda <= 0,
theta0 <= 0, gamma <= 0 and any non-finite argument (mu = 0.0 is a
valid hover-limit input).
- Run the contract test offline: python3
scripts/test_rotorcraft_forward_flight_flapping.py (34 tests,
deterministic, no network).
Pitfalls
- Passing gamma to longitudinal_flapping_angle: the function takes no
Lock number argument by design, because gamma cancels exactly in the
1/rev cos balance; only mu, lam and theta0 are needed.
- Reading a1s sign as an error: a1s < 0 is the pinned convention for
the aft tip-path-plane tilt of forward flight, not a bug; it grows
more negative as mu increases.
- Using this leaf for hover: at mu = 0 the leaf reduces exactly to the
hover sibling's coning closed form, but the hover Lock number, hover
coning angle and flap frequency ratio quantities themselves belong to
rotorcraft-blade-flapping-dynamics.
- Extrapolating past mu = 1: the model is singular at mu = 1
(denominator 1 - mu^2/2 stays finite there, but the underlying
uniform-inflow idealization and reverse-flow omission break down long
before mu = 1); ValueError rejects mu >= 1.0.
- Treating the first-harmonic truncation as exact: the model omits
2/rev and higher flapping harmonics, whose residual is documented in
the spec at order 1e-2 rad at the worked point and does not enter the
tip-path-plane tilt reported here.
Related leaves
- flight-mechanics/performance/rotorcraft-blade-flapping-dynamics: the
hover-state sibling that owns the Lock number, the hover coning angle
and the flap frequency ratio; this leaf's hover limit reproduces its
coning closed form.
- flight-mechanics/performance/rotorcraft-forward-flight-performance:
the power and best-speeds leaf of forward flight (Glauert inflow,
induced, parasite and profile power); it never touches blade motion.
- flight-mechanics/performance/rotorcraft-lead-lag-dynamics: the
in-plane blade motion sibling, lag frequency ratio and ground
resonance clearance, distinct from out-of-plane flapping.
Behavior contract (gate 3)
Run the deterministic contract test (stdlib unittest, offline):
python3 scripts/test_rotorcraft_forward_flight_flapping.py
The test covers the worked-example values of the coning, longitudinal
and lateral flapping angles in radians and degrees, the hover
cross-leaf coning identity, the collective-inflow balance zero, the
coning-coupling identity, the exact two-point inflow linearity of the
tilt slopes, the monotone growth of the flapping magnitudes with
advance ratio, the one-call summary dict contract, ValueError rejection
of every non-physical or non-finite input, and run-to-run determinism.
Compliance
- Standards referenced, not reproduced: FAR-29 is the FAA
transport-category rotorcraft airworthiness standard (ecfr.gov); the
flap-equilibrium relations above are standard engineering methodology
(Johnson, Leishman), summary-only per standards-map.yaml.
- compliance: STANDARDS-REF, gated: false.
1---2name: rotorcraft-forward-flight-flapping3description: Use when you must compute the steady first-harmonic (1/rev) flapping equilibrium of a helicopter main rotor blade in forward flight under uniform inflow: the longitudinal flapping angle a1s (the tip-path-plane aft tilt, negative few degrees at cruise) and the lateral flapping angle b1s of the idealized centrally hinged untwisted blade from the advance ratio, the inflow ratio, the collective pitch and the blade Lock number gamma, with the forward-flight coning angle a0 that reduces to the hover coning value at zero advance ratio. Produces the longitudinal and lateral flapping angles and the coning angle in radians and degrees and the first-harmonic flap summary that gates rotorcraft trim assessments and tip-path-plane checks. Trigger: rotorcraft forward flight flapping, tip path plane tilt, first harmonic flap response, longitudinal flapping angle, lateral flapping angle, advance ratio flapping, flap equilibrium tilt.4license: Apache-2.05---67# Rotorcraft Forward-Flight Flapping (flight-mechanics/performance/rotorcraft-forward-flight-flapping)89Use when the task is the steady first-harmonic flapping equilibrium of a10helicopter main rotor blade in forward flight: the tip-path-plane tilt11that the idealized centrally hinged, untwisted blade settles into under12uniform inflow at a given advance ratio. This leaf implements the13classical harmonic balance of the flap equation (Johnson, Helicopter14Theory ch. 4 and Leishman, Principles of Helicopter Aerodynamics ch. 4,15paraphrased, never reproduced) in pure Python, stdlib only,16deterministic. It is the forward-flight extension of17flight-mechanics/performance/rotorcraft-blade-flapping-dynamics, which18owns only the hover-state Lock number, hover coning angle and flap19frequency ratio; the forward-flight flap equilibrium, tip-path-plane20tilt and first-harmonic content live here.2122## Domain quick reference2324- Blade element velocities in the hub plane frame: u_T = x + mu*sin(psi)25 (tangential, x = r/R) and u_P = lambda + x*beta' + mu*beta*cos(psi)26 (perpendicular), with psi measured from the downwind blade position,27 advancing side at psi = pi/2.28- First-harmonic flap ansatz: beta(psi) = a0 + a1s*cos(psi) +29 b1s*sin(psi), with a0 the coning angle, a1s the longitudinal (cos)30 component and b1s the lateral (sin) component.31- Flap equation with nu = 1 (central hinge): beta'' + beta =32 (gamma/2)*M(psi). The steady part fixes a0 (centrifugal balance); the33 1/rev part vanishes identically at resonance, so equilibrium nulls the34 cos and sin projections of the aerodynamic flap moment M(psi).35- Closed forms (exact solution of the 3 by 3 harmonic-balance system):36 a0 = (gamma/2)*(theta0*(1 + mu^2)/4 - lambda/3),37 a1s = -4*mu*(2*theta0/3 - lambda/2)/(1 - mu^2/2),38 b1s = -(4*mu/3)*a0/(1 + mu^2/2).39- a1s is gamma-free: the aerodynamic forcing and damping both scale with40 the Lock number and cancel in the 1/rev cos balance. b1s carries gamma41 through the coning coupling to a0.42- Hover limit: mu = 0 gives a0 equal to the hover leaf closed form43 0.5*gamma*(theta0/4 - lambda/3), and a1s = b1s = 0 exactly.44- Sign convention: a1s < 0 means the tip-path plane tilts aft (the45 flapping-back direction of forward flight); b1s < 0 means the46 advancing blade (psi = pi/2) tip sits below the coning plane.47- Scope: 0 <= mu < 1 (singular at mu = 1, reverse flow out of scope),48 lambda > 0 (downward-positive convention), theta0 > 0, centrally49 hinged, first harmonic only, small angles.50- Units are radians for the angle inputs and the _rad outputs; the51 _deg outputs are the _rad values times 180/pi.52- FAR-29 frames the transport-category rotorcraft certification53 context for rotor loads; the relations above are standard engineering54 methodology, summary-only.5556## Workflow57581. Fix the operating point: advance ratio mu, uniform inflow ratio59 lambda, collective pitch theta0 and blade Lock number gamma (the60 same gamma the hover sibling computes from blade geometry).612. Compute the forward-flight coning angle with forward_coning_angle62 and compare it against the hover coning value at the same theta0 and63 lambda (the theta0*mu^2/4 dynamic-pressure gain).643. Compute the longitudinal flapping angle with65 longitudinal_flapping_angle and read the tip-path-plane aft tilt (no66 gamma argument: it cancels in the 1/rev balance).674. Compute the lateral flapping angle with lateral_flapping_angle and68 confirm the coning-coupling identity against forward_coning_angle.695. Run forward_flap_summary for the one-call dict with all six70 documented keys in radians and degrees.716. Check the inflow sensitivity of the tip-path-plane tilt: raising72 lambda relaxes the aft tilt, lowering it steepens the aft tilt, and73 the two-point differences are exact closed-form linear slopes.747. Confirm the flapping angles grow in magnitude with advance ratio mu75 over the operating range and stay inside the published few-degree76 band.778. Confirm the deterministic checks with the contract test78 scripts/test_rotorcraft_forward_flight_flapping.py.7980## Worked example8182Cruise case: advance ratio mu = 0.3, uniform inflow ratio lambda = 0.06,83collective theta0 = 0.14 rad, Lock number gamma = 6.0 (a light-to-medium84blade in the hover sibling's gamma 5-8 and lambda 0.05-0.08 band). Real85module outputs:8687- forward_coning_angle(0.3, 0.06, 0.14, 6.0) = 0.05445 rad = 3.1197688 deg, 21 percent above the hover value 0.045 rad at the same theta089 and lambda.90- longitudinal_flapping_angle(0.3, 0.06, 0.14) = -0.07958 rad = -4.559791 deg: the tip-path plane tilts aft by about 4.56 deg. The magnitude92 grows with mu: 1.459 deg at mu = 0.1, 2.962 deg at mu = 0.2, 4.560 deg93 at mu = 0.3, 5.412 deg at mu = 0.35.94- lateral_flapping_angle(0.3, 0.06, 0.14, 6.0) = -0.02084 rad = -1.194295 deg: the advancing side sits about 1.19 deg below the coning plane,96 also growing with mu.97- Inflow sensitivity at the worked point: raising lambda to 0.0898 relaxes the aft tilt to a1s = -3.8397 deg; lowering it to 0.0599 steepens the aft tilt to -4.9196 deg.100- Hover-limit anchor at the same theta0, lambda, gamma: mu = 0.0 gives101 a0 = 0.045 rad, a1s = 0.0 and b1s = 0.0 exactly.102- forward_flap_summary(0.3, 0.06, 0.14, 6.0) returns the six-key dict:103 coning_angle_rad 0.05445, coning_angle_deg 3.11976,104 longitudinal_flapping_rad -0.07958, longitudinal_flapping_deg105 -4.5597, lateral_flapping_rad -0.02084, lateral_flapping_deg -1.1942.106107## Verification108109- Confirm forward_coning_angle(0.3, 0.06, 0.14, 6.0) matches the worked110 value and that mu = 0.0 reproduces the hover sibling closed form111 0.5*gamma*(theta0/4 - lambda/3).112- Confirm longitudinal_flapping_angle(0.3, 0.06, 0.14) matches the113 worked value, is exactly 0.0 at mu = 0.0, and is exactly 0.0 at the114 collective-inflow balance theta0 = 3*lambda/4.115- Confirm lateral_flapping_angle satisfies the coning-coupling identity116 -(4*mu/3)*forward_coning_angle/(1 + mu^2/2) at the worked point and at117 a second point.118- Confirm the two-point inflow differences match the exact closed-form119 slopes 2*mu/(1 - mu^2/2), -gamma/6 and (2*mu*gamma/9)/(1 + mu^2/2).120- Confirm |a1s| and |b1s| strictly increase over mu = 0.1, 0.2, 0.3,121 0.35 at fixed lambda and theta0.122- Confirm forward_flap_summary returns exactly the six documented keys123 and each matches the corresponding component function.124- Confirm ValueError rejection of mu < 0, mu >= 1, lambda <= 0,125 theta0 <= 0, gamma <= 0 and any non-finite argument (mu = 0.0 is a126 valid hover-limit input).127- Run the contract test offline: python3128 scripts/test_rotorcraft_forward_flight_flapping.py (34 tests,129 deterministic, no network).130131## Pitfalls132133- Passing gamma to longitudinal_flapping_angle: the function takes no134 Lock number argument by design, because gamma cancels exactly in the135 1/rev cos balance; only mu, lam and theta0 are needed.136- Reading a1s sign as an error: a1s < 0 is the pinned convention for137 the aft tip-path-plane tilt of forward flight, not a bug; it grows138 more negative as mu increases.139- Using this leaf for hover: at mu = 0 the leaf reduces exactly to the140 hover sibling's coning closed form, but the hover Lock number, hover141 coning angle and flap frequency ratio quantities themselves belong to142 rotorcraft-blade-flapping-dynamics.143- Extrapolating past mu = 1: the model is singular at mu = 1144 (denominator 1 - mu^2/2 stays finite there, but the underlying145 uniform-inflow idealization and reverse-flow omission break down long146 before mu = 1); ValueError rejects mu >= 1.0.147- Treating the first-harmonic truncation as exact: the model omits148 2/rev and higher flapping harmonics, whose residual is documented in149 the spec at order 1e-2 rad at the worked point and does not enter the150 tip-path-plane tilt reported here.151152## Related leaves153154- flight-mechanics/performance/rotorcraft-blade-flapping-dynamics: the155 hover-state sibling that owns the Lock number, the hover coning angle156 and the flap frequency ratio; this leaf's hover limit reproduces its157 coning closed form.158- flight-mechanics/performance/rotorcraft-forward-flight-performance:159 the power and best-speeds leaf of forward flight (Glauert inflow,160 induced, parasite and profile power); it never touches blade motion.161- flight-mechanics/performance/rotorcraft-lead-lag-dynamics: the162 in-plane blade motion sibling, lag frequency ratio and ground163 resonance clearance, distinct from out-of-plane flapping.164165## Behavior contract (gate 3)166167Run the deterministic contract test (stdlib unittest, offline):168169 python3 scripts/test_rotorcraft_forward_flight_flapping.py170171The test covers the worked-example values of the coning, longitudinal172and lateral flapping angles in radians and degrees, the hover173cross-leaf coning identity, the collective-inflow balance zero, the174coning-coupling identity, the exact two-point inflow linearity of the175tilt slopes, the monotone growth of the flapping magnitudes with176advance ratio, the one-call summary dict contract, ValueError rejection177of every non-physical or non-finite input, and run-to-run determinism.178179## Compliance180181- Standards referenced, not reproduced: FAR-29 is the FAA182 transport-category rotorcraft airworthiness standard (ecfr.gov); the183 flap-equilibrium relations above are standard engineering methodology184 (Johnson, Leishman), summary-only per standards-map.yaml.185- compliance: STANDARDS-REF, gated: false.