Fuel Jettison Flight Test (flight-test-operations/performance/fuel-jettison-flight-test)
Use when you must reduce a fuel jettison flight test demonstration from
telemetered fuel-weight-vs-time samples taken while the dump is running:
fit the sample weights W(t) with a deterministic closed-form
least-squares straight line, read the measured average dump rate from the
fitted slope, extrapolate the time the aircraft needs to come down from
its takeoff weight to its landing weight at that measured rate, and give
the PASS or FAIL verdict against the 900 s limit of FAR 25.1001 (name and
requirement frame only, no verbatim rule text). This leaf is the
flight-test verification side of the jettison function; the design side,
vehicle-design/sizing/fuel-jettison-sizing, sets the required rate q_req
from MTOW and MLW over the same 900 s limit, and this leaf checks the
measured rate against that anchor. The planning-pack data leaves stop
short of this reduction: flight-test-data-reduction applies channel
calibration and smoothing only, with no fitted dump rate and no
landing-weight extrapolation, and cruise-performance-flight-test reduces
fuel flow versus Mach with no weight-vs-time dump reduction, so this leaf
fills the measured jettison demonstration analysis gap.
Domain quick reference
- Jettison demonstration limit: FAR 25.1001 frames the fuel jettison
demonstration within 15 minutes of flight (name and frame only, no rule
text reproduced). Module constant JETTISON_LIMIT_S = 900.0 s.
- Sample model over the dump window: W(t) = intercept + slope * t, slope
in kg/s (negative while fuel is dumped), intercept in kg.
- Least-squares closed forms: slope = (n * sum(t*w) - sum(t) * sum(w)) /
(n * sum(t^2) - (sum(t))^2), intercept = mean(w) - slope * mean(t).
- Coefficient of determination: r_squared = 1 - ss_res / ss_tot with
ss_res the residual sum of squares and ss_tot = sum((w - mean(w))^2);
when ss_tot is 0 (all weights equal) r_squared is defined as 1.0.
- Measured average dump rate: measured_rate = -slope, positive for a
dump. A non-negative fitted slope means no dump is observable in the
window (ValueError).
- Extrapolated time to the landing weight: t = (w_start - w_landing) /
rate in seconds, with w_start the takeoff weight at dump start and
w_landing the landing weight target.
- Verdict: PASS when t <= limit (inclusive at the boundary, so exactly
900.0 s is PASS), else FAIL. margin_s = limit - t, positive for PASS
and negative for FAIL.
- Rate requirement check: the design side's anchor is q_req = (MTOW -
MLW) / 900 s. meets is True when measured_rate >= q_req (inclusive);
margin_kg_s = measured_rate - q_req.
- Units are SI: kg, kg/s, s. Deterministic stdlib least squares only;
scatter in the samples is handled by the fit's r_squared, not by a
stochastic model.
Workflow
- Assemble the dump-window samples: order the telemetered
fuel-weight-vs-time samples W(t) taken while the dump is running, with
strictly increasing times and the takeoff weight at dump start noted
as w_start, plus the landing weight target w_landing.
- Fit the weight trend with the least-squares lsq_fit over the dump
window: lsq_fit(weights, times) returns the fitted slope, intercept
and r_squared; a low r_squared flags scatter or a non-linear trace.
- Read the measured average dump rate from the fitted slope:
measured_rate(weights, times) returns -slope in kg/s and raises
ValueError when no dump is observable.
- Extrapolate the time to the landing weight:
time_to_landing_weight(w_start, w_landing, rate) returns
(w_start - w_landing) / rate in seconds at the measured rate.
- Judge the PASS or FAIL verdict against the 900 s limit:
verdict(time_s, limit) returns the verdict, the limit used and the
margin in seconds; the boundary is inclusive.
- Check the rate requirement against the required rate:
rate_meets_requirement(measured, required) compares the measured rate
with the design side's q_req and reports meets with the rate margin in
kg/s.
- Summarize the demonstration reduction with reduce_dump_demonstration:
one call on the samples, w_start, w_landing, required_rate and limit
returns the nine-key record (measured rate, r_squared, time to the
landing weight, verdict, limit, margin, requirement verdict, required
rate, rate margin), chaining steps 3 to 6 in order.
- Reject non-physical inputs and confirm determinism: every function
raises ValueError on the invalid inputs listed in Verification, and
the module is deterministic with fixed constants, verified by the
contract test.
Worked example
Reference transport at the design leaf's own weights: takeoff weight
79,000 kg, landing weight 66,500 kg, so the required rate anchor q_req =
(79000 - 66500) / 900 = 13.88888889 kg/s. Six telemetered samples at 60 s
spacing over a 300 s dump window: weights 79000, 78148, 77305, 76450,
75605, 74756 kg at times 0, 60, 120, 180, 240, 300 s. Real module
outputs:
- lsq_fit: slope = -14.1447619 kg/s, intercept = 78999.04762 kg,
r_squared = 0.9999978496.
- measured_rate = 14.1447619 kg/s, the positive fitted dump rate.
- time_to_landing_weight(79000, 66500, 14.1447619) = 883.7193644 s,
inside the 900 s limit.
- verdict(883.7193644) = {"verdict": "PASS", "limit_s": 900.0,
"margin_s": 16.2806356}.
- rate_meets_requirement(14.1447619, 13.88888889) = {"meets": True,
"margin_kg_s": 0.2558730159}: the measured rate clears q_req.
- reduce_dump_demonstration returns measured_rate_kg_s 14.1447619,
r_squared 0.9999978496, time_to_landing_weight_s 883.7193644, verdict
PASS, limit_s 900.0, margin_s 16.2806356, meets_required_rate True,
required_rate_kg_s 13.88888889, rate_margin_kg_s 0.2558730159.
- Boundary anchors: a rate of exactly 13.88888889 kg/s gives exactly
900.0 s and PASS with zero margin; verdict(900.001) is FAIL with
margin_s -0.001; a slow dump at 13.0 kg/s gives 961.5384615 s and FAIL
with margin_s -61.53846154.
- Perfect-fit identity: samples exactly on W = 79000 - 14.15 * t recover
slope -14.15, measured_rate 14.15 and r_squared exactly 1.0.
Verification
- Confirm lsq_fit on the worked example returns slope -14.1447619 within
1e-6, intercept 78999.04762 within 1e-3 and r_squared 0.9999978496
within 1e-9.
- Confirm measured_rate equals -lsq_fit slope by construction and returns
14.1447619 within 1e-6.
- Confirm time_to_landing_weight(79000, 66500, 14.1447619) = 883.7193644
within 1e-4 and that the function is exactly (w_start - w_landing) /
rate at any valid inputs.
- Confirm the inclusive verdict boundary: verdict(900.0) is PASS with
zero margin, verdict(900.001) is FAIL with margin_s -0.001.
- Confirm the inclusive rate-requirement boundary: measured equal to
required is meets True with zero rate margin.
- Confirm perfect-line samples are recovered exactly (r_squared exactly
1.0) and that all non-physical inputs raise ValueError: fewer than 2
samples, unequal-length arrays, times not strictly increasing, zero fit
denominator from duplicate times, a non-negative fitted slope (no dump
observed), w_start <= 0, w_landing <= 0, w_start <= w_landing, rate <=
0, time_s <= 0, limit <= 0, measured <= 0 and required <= 0.
- Run the deterministic contract test offline: python3
scripts/test_fuel_jettison_flight_test.py (33 tests).
Related leaves
- vehicle-design/sizing/fuel-jettison-sizing: the design-side partner
that sets q_req from MTOW and MLW over the 900 s limit; this leaf
checks the measured rate against that anchor from flight data.
- flight-test-operations/performance/cruise-performance-flight-test: the
closest performance data-analysis sibling, fuel flow versus Mach with
the square-root weight correction; it does no dump reduction.
- flight-test-operations/performance/engine-flight-test: thrust, EGT and
transient times from engine flight tests; no weight-vs-time reduction.
- flight-test-operations/planning/flight-test-data-reduction: channel
calibration and moving-average smoothing of raw traces, upstream of the
fitted-rate reduction in this leaf.
- flight-test-operations/planning/flight-test-planning: ordering of test
points and go/no-go gating that frames the demonstration flight.
Contract test
Run the deterministic contract test (stdlib unittest, offline, no
network, under 1 s):
cd ~/AeroSkills
python3 skills/flight-test-operations/performance/fuel-jettison-flight-test/scripts/test_fuel_jettison_flight_test.py
It covers the worked-example least-squares fit (slope, intercept,
r_squared), the measured-rate read and its negative-slope identity, the
landing-weight time extrapolation and its direct identity, the inclusive
verdict boundary at 900.0 s, the inclusive rate-requirement boundary, the
perfect-line recovery identity, the nine-key demonstration summary and
its agreement with the chained steps, ValueError rejection of every
non-physical input listed in Verification, determinism of repeated runs,
and the fixed module constants.
Pitfalls
- Reporting the fitted slope as the dump rate: the slope is negative
while fuel is dumped (about -14.14 kg/s in the example); the measured
average dump rate is its negative, so quoting the raw slope as a
positive rate or taking the absolute value of a rising trace hides
that no dump was observed.
- Verdict from a two-sample chord instead of the trend: the extrapolated
time must come from the least-squares slope over the dump window, not
from the chord of the first and last sample, because scatter can tilt
the chord by more than the trend tolerance on short windows.
- Confusing the verdict with the rate-requirement check: the verdict
extrapolates the time at the measured rate from the actual test weights
against the 900 s limit, while the requirement check compares the
measured rate with q_req directly; a test that starts below MTOW can
PASS the verdict with a rate below q_req, so report both margins.
- Treating the boundary as strict: exactly 900.0 s is PASS and a rate of
exactly (MTOW - MLW) / 900 gives exactly 900.0 s, so strict-less
comparisons flip a legal demonstration to FAIL at the limit.
- Extrapolating from the wrong starting weight: w_start is the takeoff
weight at dump start, not the first fitted intercept or a book MTOW
when the dump begins below it; the time is driven by the weight
actually on board when the dump starts.
- Ignoring r_squared: a fit far below 1.0 means the weight trace is not a
clean linear dump (pump cycling, sensor noise, or the dump stopping
mid-window), and the extrapolated time is not a trustworthy verdict
input.
Behavior contract (gate 3)
Run the deterministic contract test (stdlib unittest, offline):
python3 scripts/test_fuel_jettison_flight_test.py
The test covers the worked-example reduction (measured dump rate
14.1447619 kg/s within 1e-6, time to the landing weight 883.7193644 s
within 1e-4, PASS verdict with margin 16.2806356 s, requirement met with
rate margin 0.2558730159 kg/s), the least-squares fit anchors, the
inclusive verdict and rate-requirement boundaries, the perfect-line and
direct identities, the nine-key summary, ValueError rejection of all
non-physical inputs, determinism and the fixed module constants. Exit 0
with 33 tests passing is the creation gate.
Compliance
- FAR 25.1001 frames the fuel jettison demonstration requirement; it is
named and paraphrased only (15-minute frame, PASS within the limit) and
never reproduced verbatim, per standards-map.yaml reference-only
convention. Id: far-25.
- compliance: STANDARDS-REF, gated: false.
1---2name: fuel-jettison-flight-test3description: Use when you must reduce a fuel jettison flight test demonstration: least-squares fit the telemetered fuel-weight-vs-time samples taken while the dump runs, read the measured average dump rate from the fitted slope, extrapolate the time from the takeoff weight down to the landing weight at that measured rate, judge the PASS or FAIL verdict against the 900 s limit, and check the measured rate against the design-side required rate. Produces the fitted slope, intercept and R^2, the measured dump rate, the extrapolated landing-weight time, the verdict with margin in seconds, and the rate-requirement check with margin in kg/s. Trigger: fuel jettison flight test, measured dump rate, fuel-weight-vs-time samples, jettison demonstration.4license: Apache-2.05---67# Fuel Jettison Flight Test (flight-test-operations/performance/fuel-jettison-flight-test)89Use when you must reduce a fuel jettison flight test demonstration from10telemetered fuel-weight-vs-time samples taken while the dump is running:11fit the sample weights W(t) with a deterministic closed-form12least-squares straight line, read the measured average dump rate from the13fitted slope, extrapolate the time the aircraft needs to come down from14its takeoff weight to its landing weight at that measured rate, and give15the PASS or FAIL verdict against the 900 s limit of FAR 25.1001 (name and16requirement frame only, no verbatim rule text). This leaf is the17flight-test verification side of the jettison function; the design side,18vehicle-design/sizing/fuel-jettison-sizing, sets the required rate q_req19from MTOW and MLW over the same 900 s limit, and this leaf checks the20measured rate against that anchor. The planning-pack data leaves stop21short of this reduction: flight-test-data-reduction applies channel22calibration and smoothing only, with no fitted dump rate and no23landing-weight extrapolation, and cruise-performance-flight-test reduces24fuel flow versus Mach with no weight-vs-time dump reduction, so this leaf25fills the measured jettison demonstration analysis gap.2627## Domain quick reference2829- Jettison demonstration limit: FAR 25.1001 frames the fuel jettison30 demonstration within 15 minutes of flight (name and frame only, no rule31 text reproduced). Module constant JETTISON_LIMIT_S = 900.0 s.32- Sample model over the dump window: W(t) = intercept + slope * t, slope33 in kg/s (negative while fuel is dumped), intercept in kg.34- Least-squares closed forms: slope = (n * sum(t*w) - sum(t) * sum(w)) /35 (n * sum(t^2) - (sum(t))^2), intercept = mean(w) - slope * mean(t).36- Coefficient of determination: r_squared = 1 - ss_res / ss_tot with37 ss_res the residual sum of squares and ss_tot = sum((w - mean(w))^2);38 when ss_tot is 0 (all weights equal) r_squared is defined as 1.0.39- Measured average dump rate: measured_rate = -slope, positive for a40 dump. A non-negative fitted slope means no dump is observable in the41 window (ValueError).42- Extrapolated time to the landing weight: t = (w_start - w_landing) /43 rate in seconds, with w_start the takeoff weight at dump start and44 w_landing the landing weight target.45- Verdict: PASS when t <= limit (inclusive at the boundary, so exactly46 900.0 s is PASS), else FAIL. margin_s = limit - t, positive for PASS47 and negative for FAIL.48- Rate requirement check: the design side's anchor is q_req = (MTOW -49 MLW) / 900 s. meets is True when measured_rate >= q_req (inclusive);50 margin_kg_s = measured_rate - q_req.51- Units are SI: kg, kg/s, s. Deterministic stdlib least squares only;52 scatter in the samples is handled by the fit's r_squared, not by a53 stochastic model.5455## Workflow56571. Assemble the dump-window samples: order the telemetered58 fuel-weight-vs-time samples W(t) taken while the dump is running, with59 strictly increasing times and the takeoff weight at dump start noted60 as w_start, plus the landing weight target w_landing.612. Fit the weight trend with the least-squares lsq_fit over the dump62 window: lsq_fit(weights, times) returns the fitted slope, intercept63 and r_squared; a low r_squared flags scatter or a non-linear trace.643. Read the measured average dump rate from the fitted slope:65 measured_rate(weights, times) returns -slope in kg/s and raises66 ValueError when no dump is observable.674. Extrapolate the time to the landing weight:68 time_to_landing_weight(w_start, w_landing, rate) returns69 (w_start - w_landing) / rate in seconds at the measured rate.705. Judge the PASS or FAIL verdict against the 900 s limit:71 verdict(time_s, limit) returns the verdict, the limit used and the72 margin in seconds; the boundary is inclusive.736. Check the rate requirement against the required rate:74 rate_meets_requirement(measured, required) compares the measured rate75 with the design side's q_req and reports meets with the rate margin in76 kg/s.777. Summarize the demonstration reduction with reduce_dump_demonstration:78 one call on the samples, w_start, w_landing, required_rate and limit79 returns the nine-key record (measured rate, r_squared, time to the80 landing weight, verdict, limit, margin, requirement verdict, required81 rate, rate margin), chaining steps 3 to 6 in order.828. Reject non-physical inputs and confirm determinism: every function83 raises ValueError on the invalid inputs listed in Verification, and84 the module is deterministic with fixed constants, verified by the85 contract test.8687## Worked example8889Reference transport at the design leaf's own weights: takeoff weight9079,000 kg, landing weight 66,500 kg, so the required rate anchor q_req =91(79000 - 66500) / 900 = 13.88888889 kg/s. Six telemetered samples at 60 s92spacing over a 300 s dump window: weights 79000, 78148, 77305, 76450,9375605, 74756 kg at times 0, 60, 120, 180, 240, 300 s. Real module94outputs:9596- lsq_fit: slope = -14.1447619 kg/s, intercept = 78999.04762 kg,97 r_squared = 0.9999978496.98- measured_rate = 14.1447619 kg/s, the positive fitted dump rate.99- time_to_landing_weight(79000, 66500, 14.1447619) = 883.7193644 s,100 inside the 900 s limit.101- verdict(883.7193644) = {"verdict": "PASS", "limit_s": 900.0,102 "margin_s": 16.2806356}.103- rate_meets_requirement(14.1447619, 13.88888889) = {"meets": True,104 "margin_kg_s": 0.2558730159}: the measured rate clears q_req.105- reduce_dump_demonstration returns measured_rate_kg_s 14.1447619,106 r_squared 0.9999978496, time_to_landing_weight_s 883.7193644, verdict107 PASS, limit_s 900.0, margin_s 16.2806356, meets_required_rate True,108 required_rate_kg_s 13.88888889, rate_margin_kg_s 0.2558730159.109- Boundary anchors: a rate of exactly 13.88888889 kg/s gives exactly110 900.0 s and PASS with zero margin; verdict(900.001) is FAIL with111 margin_s -0.001; a slow dump at 13.0 kg/s gives 961.5384615 s and FAIL112 with margin_s -61.53846154.113- Perfect-fit identity: samples exactly on W = 79000 - 14.15 * t recover114 slope -14.15, measured_rate 14.15 and r_squared exactly 1.0.115116## Verification117118- Confirm lsq_fit on the worked example returns slope -14.1447619 within119 1e-6, intercept 78999.04762 within 1e-3 and r_squared 0.9999978496120 within 1e-9.121- Confirm measured_rate equals -lsq_fit slope by construction and returns122 14.1447619 within 1e-6.123- Confirm time_to_landing_weight(79000, 66500, 14.1447619) = 883.7193644124 within 1e-4 and that the function is exactly (w_start - w_landing) /125 rate at any valid inputs.126- Confirm the inclusive verdict boundary: verdict(900.0) is PASS with127 zero margin, verdict(900.001) is FAIL with margin_s -0.001.128- Confirm the inclusive rate-requirement boundary: measured equal to129 required is meets True with zero rate margin.130- Confirm perfect-line samples are recovered exactly (r_squared exactly131 1.0) and that all non-physical inputs raise ValueError: fewer than 2132 samples, unequal-length arrays, times not strictly increasing, zero fit133 denominator from duplicate times, a non-negative fitted slope (no dump134 observed), w_start <= 0, w_landing <= 0, w_start <= w_landing, rate <=135 0, time_s <= 0, limit <= 0, measured <= 0 and required <= 0.136- Run the deterministic contract test offline: python3137 scripts/test_fuel_jettison_flight_test.py (33 tests).138139## Related leaves140141- vehicle-design/sizing/fuel-jettison-sizing: the design-side partner142 that sets q_req from MTOW and MLW over the 900 s limit; this leaf143 checks the measured rate against that anchor from flight data.144- flight-test-operations/performance/cruise-performance-flight-test: the145 closest performance data-analysis sibling, fuel flow versus Mach with146 the square-root weight correction; it does no dump reduction.147- flight-test-operations/performance/engine-flight-test: thrust, EGT and148 transient times from engine flight tests; no weight-vs-time reduction.149- flight-test-operations/planning/flight-test-data-reduction: channel150 calibration and moving-average smoothing of raw traces, upstream of the151 fitted-rate reduction in this leaf.152- flight-test-operations/planning/flight-test-planning: ordering of test153 points and go/no-go gating that frames the demonstration flight.154155## Contract test156157Run the deterministic contract test (stdlib unittest, offline, no158network, under 1 s):159160 cd ~/AeroSkills161 python3 skills/flight-test-operations/performance/fuel-jettison-flight-test/scripts/test_fuel_jettison_flight_test.py162163It covers the worked-example least-squares fit (slope, intercept,164r_squared), the measured-rate read and its negative-slope identity, the165landing-weight time extrapolation and its direct identity, the inclusive166verdict boundary at 900.0 s, the inclusive rate-requirement boundary, the167perfect-line recovery identity, the nine-key demonstration summary and168its agreement with the chained steps, ValueError rejection of every169non-physical input listed in Verification, determinism of repeated runs,170and the fixed module constants.171172## Pitfalls173174- Reporting the fitted slope as the dump rate: the slope is negative175 while fuel is dumped (about -14.14 kg/s in the example); the measured176 average dump rate is its negative, so quoting the raw slope as a177 positive rate or taking the absolute value of a rising trace hides178 that no dump was observed.179- Verdict from a two-sample chord instead of the trend: the extrapolated180 time must come from the least-squares slope over the dump window, not181 from the chord of the first and last sample, because scatter can tilt182 the chord by more than the trend tolerance on short windows.183- Confusing the verdict with the rate-requirement check: the verdict184 extrapolates the time at the measured rate from the actual test weights185 against the 900 s limit, while the requirement check compares the186 measured rate with q_req directly; a test that starts below MTOW can187 PASS the verdict with a rate below q_req, so report both margins.188- Treating the boundary as strict: exactly 900.0 s is PASS and a rate of189 exactly (MTOW - MLW) / 900 gives exactly 900.0 s, so strict-less190 comparisons flip a legal demonstration to FAIL at the limit.191- Extrapolating from the wrong starting weight: w_start is the takeoff192 weight at dump start, not the first fitted intercept or a book MTOW193 when the dump begins below it; the time is driven by the weight194 actually on board when the dump starts.195- Ignoring r_squared: a fit far below 1.0 means the weight trace is not a196 clean linear dump (pump cycling, sensor noise, or the dump stopping197 mid-window), and the extrapolated time is not a trustworthy verdict198 input.199200## Behavior contract (gate 3)201202Run the deterministic contract test (stdlib unittest, offline):203204 python3 scripts/test_fuel_jettison_flight_test.py205206The test covers the worked-example reduction (measured dump rate20714.1447619 kg/s within 1e-6, time to the landing weight 883.7193644 s208within 1e-4, PASS verdict with margin 16.2806356 s, requirement met with209rate margin 0.2558730159 kg/s), the least-squares fit anchors, the210inclusive verdict and rate-requirement boundaries, the perfect-line and211direct identities, the nine-key summary, ValueError rejection of all212non-physical inputs, determinism and the fixed module constants. Exit 0213with 33 tests passing is the creation gate.214215## Compliance216217- FAR 25.1001 frames the fuel jettison demonstration requirement; it is218 named and paraphrased only (15-minute frame, PASS within the limit) and219 never reproduced verbatim, per standards-map.yaml reference-only220 convention. Id: far-25.221- compliance: STANDARDS-REF, gated: false.