# Aeroelastic Gust Response

> Use when you must compute the dynamic aeroelastic response of a flexible two-degree-of-freedom typical wing section to a discrete gust with indicial unsteady aerodynamics: run the Wagner and Kussner lag-state lift model in the time domain, produce the plunge and pitch response histories for a one-minus-cosine gust, and report the dynamic magnification factor of the peak lift over the quasi-steady value plus the peak-load verdict against a limit. Produces response histories, the dynamic magnification factor, and load margin. Trigger: aeroelastic gust response, dynamic gust response, kussner function, wagner function, indicial aerodynamics, dynamic magnification factor, typical section gust, gust response history.

- Skill: `ashfordeou/aeroelastic-gust-response` (Agent Skill, multi-file: 3 files)
- Install (CLI): `npx skillmds@latest add ashfordeou/aeroelastic-gust-response`
- Raw SKILL.md: https://api.skillmd.com/api/skills/ashfordeou/aeroelastic-gust-response/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: AI & ML
- License: Apache-2.0
- Author: ashfordeOU (https://skillmd.com/u/ashfordeou)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/ashfordeou/aeroelastic-gust-response

---


# Aeroelastic Gust Response (aerodynamics/aeroelasticity/aeroelastic-gust-response)

Use when the task is the DYNAMIC response of a flexible two-degree-of-freedom
typical wing section to a discrete gust: the plunge and pitch time histories
driven by the unsteady (indicial) aerodynamic lift, the dynamic magnification
factor of the peak lift over the quasi-steady value, and the peak-load
verdict against a limit. This leaf is the flexible-section RESPONSE problem,
distinct from the rigid discrete-gust certification load case
(structures/loads/gust-maneuver-loads owns that load method), from the flutter speed search (flutter-speed-prediction
owns the V-g method), and from static divergence (divergence-speed). The
model pairs with flutter-speed-prediction: the same typical-section
machinery, a different question (stability there, forced response here).

## Domain quick reference

- Typical section: plunge h (positive DOWN, m), pitch theta (positive
  nose-up, rad) about an elastic axis at fraction e of the chord from the
  leading edge; per-unit-span mass m_s (kg/m), pitch inertia I_theta
  (kg m^2/m), plunge stiffness k_h (N/m), pitch stiffness k_theta
  (N m/rad), structural damping ignored. Reduced time s = 2*V*t/c with
  semi-chord b = c/2.
- Sign conventions: lift L is positive UPWARD (conventional lift) and the
  plunge equation is m_s*h_ddot + k_h*h = -L; an upward gust therefore
  accelerates the section upward, the physically correct direction. A
  section moving down (h_dot > 0) sees an upwash, so the effective angle at
  the three-quarter chord is alpha_m = theta + h_dot/V +
  (0.75 - e)*c*theta_dot/V; the +h_dot/V term is what gives the standard
  plunge damping. The nose-up moment about the elastic axis from the lift at
  the quarter-chord aerodynamic center is M_ea = -L*(0.25 - e)*c: for e <
  0.25 (elastic axis forward of the aerodynamic center, statically stable)
  an upward lift produces a restoring nose-down moment.
- Indicial (Duhamel) aerodynamics in lag-state form, incompressible thin
  airfoil: the motion angle alpha_m enters through the Wagner function
  phi_w(s) = 1 - A1*exp(-b1*s) - A2*exp(-b2*s) with the R.T. Jones
  two-term coefficients A1 = 0.165, b1 = 0.0455, A2 = 0.335, b2 = 0.3, and
  the gust angle alpha_g through the Kussner function phi_k(s) =
  1 - A1k*exp(-b1k*s) - A2k*exp(-b2k*s) with A1k = 0.5, b1k = 0.13, A2k =
  0.5, b2k = 1.0. The Kussner channel models streamwise gust penetration;
  apparent-mass and full Theodorsen noncirculatory terms are neglected at
  this level (documented assumption). phi_w(0) = 0.5 and phi_k(0) = 0: a
  step in alpha_m starts at half the quasi-steady lift, a sharp-edge gust
  starts at zero.
- Lag-state form: filtered states x1, x2 (Wagner, driven by alpha_m) and
  xk1, xk2 (Kussner, driven by alpha_g) follow x_dot = (2*V/c)*b_i*
  (alpha - x) per term, and the lift per unit span is L = 2*pi*rho*V^2*b*
  [(1 - A1 - A2)*alpha_m + A1*x1 + A2*x2 + (1 - A1k - A2k)*alpha_g +
  A1k*xk1 + A2k*xk2].
- Gust: one-minus-cosine vertical gust w_g (m/s, upward positive) with
  gradient length H (m), alpha_g(s) = (w_g/V)*(1 - cos(2*pi*s/s_g))/2 over
  0 <= s <= s_g, s_g = 2*H/c in reduced time, zero after. A sharp-edge gust
  is the short-gradient limit.
- Equations of motion (per unit span, RK4 in real time):
  m_s*h_ddot + k_h*h = -L and I_theta*theta_ddot + k_theta*theta = M_ea.
- Quasi-steady reference: L_qs = 2*pi*rho*V*b*w_g, the lift the peak gust
  angle w_g/V would produce on the rigid section. Dynamic magnification
  factor DMF = peak(|L(t)|)/L_qs over the encounter history.
- Quasi-static flexible reference: with q = (0.25 - e)*c*2*pi*rho*V^2*b/
  k_theta, the static aeroelastic peak lift is L_qs/(1 + q). For e = 0.2
  and the worked-example stiffness, q = 0.195 so L_qs_flex = 0.837*L_qs:
  a forward elastic axis gives static aeroelastic load relief, and a very
  long gust gradient approaches that ratio, not unity. Putting the elastic
  axis at the aerodynamic center (e = 0.25, q = 0) removes the relief and
  the long-gradient DMF approaches 1.0.
- Metric direction: for this flexible-section lift response the DMF rises
  monotonically with gradient length toward the quasi-static value; the
  shortest gradients give the smallest DMF because the section recoils and
  the gust is over before the structural response peaks. This is the
  opposite trend of the rigid discrete-gust load-factor method in the
  structures loads family, whose alleviation treatment belongs to that
  leaf, not here.
- FAR 25 and CS 25 gust-load rules frame the certification gust context;
  the relations above are standard engineering methodology, summary-only,
  no standard text reproduced.

## Workflow

1. Set the section: V, c, rho, m_s, I_theta, k_h, k_theta, e (elastic axis
   fraction from the leading edge, 0 to 1) in a params dict; the module
   checks every non-positive mass, inertia, stiffness, speed, chord and
   non-finite input with a ValueError. Choose k_h = m_s*(2*pi*f_h)^2 and
   k_theta = I_theta*(2*pi*f_theta)^2 for the target uncoupled plunge and
   pitch frequencies.
2. Confirm the indicial coefficients with wagner_coefficients() and
   kussner_coefficients() (module constants, R.T. Jones and classical
   two-term values).
3. Set the gust: w_g (m/s, upward positive), gradient length H (m). The
   gradient reduced time follows as s_g = 2*H/c. The gust angle at any
   reduced time s is gust_angle_time(w_g, V, s_g, s).
4. Integrate: gust_response_history(params, w_g, H, dt_real, t_max)
   returns the t, s, h, h_dot, theta, theta_dot, lift, alpha_gust and
   alpha_motion histories plus the peak absolute lift and its time. Use a
   dt small enough to resolve the pitch mode (about 5e-4 s for the worked
   example) and a t_max long enough for the structural settling, 2.5 s or
   more.
5. Reference: quasi_steady_peak_lift(rho, V, c, w_g) gives the rigid
   quasi-steady peak L_qs; dynamic_magnification_factor(peak_lift, L_qs)
   gives the DMF.
6. Check the peak load: peak_load_verdict(peak_lift, limit) returns the
   verdict PASS or FAIL and the fractional margin limit/peak - 1, negative
   when the limit is exceeded.
7. Sanity checks: a step in effective angle with no gust must start at
   about 0.5 of the quasi-steady lift (Wagner phi(0) = 0.5) and converge
   to the full value; the long-gradient DMF must approach the quasi-static
   flexible ratio; confirm with the contract test.

## Worked example

Transport-wing typical section: c = 2 m, m_s = 300 kg/m, I_theta = 40
kg m^2/m, elastic axis e = 0.2 (20 percent chord), k_h = 47374 N/m
(uncoupled plunge 2.0 Hz), k_theta = 39478 N m/rad (uncoupled pitch 5.0
Hz), V = 100 m/s, rho = 1.225 kg/m^3, gust w_g = 15 m/s, H = 25 m
(s_g = 25, gust duration 0.25 s).

- Rigid quasi-steady peak: L_qs = 2*pi*rho*V*b*w_g = 11545 N/m.
- Response: peak |L| = 6901 N/m at t = 0.135 s, inside the gust. The
  dynamic magnification factor is DMF = 6901/11545 = 0.598. The section
  recoils against the gust (upward plunge velocity subtracts from the
  incidence) so the flexible peak sits below the rigid quasi-steady value.
- Quasi-static flexible peak: L_qs/(1 + q) with q = (0.25 - 0.2)*2*
  2*pi*1.225*1e4*1/39478 = 0.195 gives 0.837*11545 = 9662 N/m. A much
  longer gradient H = 200 m gives DMF = 0.830, approaching that ratio; the
  residual difference is the penetration and structural lag. With the
  elastic axis at the aerodynamic center (e = 0.25) the same long gradient
  gives DMF = 0.987, approaching 1.0, confirming the aerodynamics alone
  tend to the quasi-steady peak.
- Short gradient H = 2 m (near sharp edge) gives DMF = 0.320: the DMF
  rises monotonically with gradient length for this flexible section,
  documented above.
- Peak-load verdict at H = 25 m: against a limit of 8 kN/m the peak
  6901 N/m PASSes with margin +15.9 percent; against 6.5 kN/m it FAILs
  with margin -5.8 percent.

## Verification

- Confirm a step in effective angle with no gust starts at 0.5 of the
  quasi-steady lift and converges to the full value within a few percent
  (test_lag_state_step_* methods assert ratios 0.5 -> 1.0 against the
  closed-form Wagner function).
- Confirm the worked-example run returns peak |L| = 6901 N/m and
  DMF = 0.598 at H = 25 m, and that the long-gradient DMF (H = 200 m) sits
  in [0.78, 0.88], the e = 0.25 variant in [0.93, 1.05], and DMF(2 m) <
  DMF(25 m) < DMF(200 m).
- Confirm peak_load_verdict returns FAIL with a negative margin when the
  limit is below the computed peak.
- Confirm ValueError rejection of non-positive V, c, rho, m_s, I_theta,
  k_h, k_theta, H, dt and t_max, negative w_g, elastic axis outside
  [0, 1], missing parameter keys and non-finite inputs.
- Run the contract test offline: python3
  scripts/test_aeroelastic_gust_response.py (35 tests, deterministic,
  under 1 s).

## Related leaves

- aerodynamics/aeroelasticity/flutter-speed-prediction: the stability
  counterpart of this leaf, V-g flutter speed of the same typical section.
- aerodynamics/aeroelasticity/divergence-speed: static divergence of a
  section whose elastic axis lies aft of the aerodynamic center.
- structures/loads/gust-maneuver-loads: the rigid discrete-gust
  certification load factor method, the other half of the gust-loads
  story.

## Pitfalls

- Confusing the DMF trend with the rigid discrete-gust method: on this
  flexible section the DMF rises monotonically with gradient length
  (0.320 at H = 2 m, 0.598 at H = 25 m, 0.830 at H = 200 m) toward the
  quasi-static flexible ratio - the opposite of the rigid-gust
  load-factor alleviation trend owned by the structures loads family.
- Reporting the rigid quasi-steady lift as the load: the flexible peak
  |L| = 6901 N/m in the worked example is only 0.598 of L_qs = 11545
  N/m because the section recoils against the gust; run the response
  history, do not substitute the quasi-steady anchor.
- Misreading the plunge sign: h is positive DOWN and the plunge equation
  is m_s*h_ddot + k_h*h = -L, so an upward gust drives the section
  upward and a downward-moving section adds +h_dot/V upwash incidence -
  flipping these signs removes the plunge damping.
- Integrating too coarsely for the pitch mode: the worked example needs
  dt near 5e-4 s to resolve the 5 Hz pitch mode, and t_max long enough
  (2.5 s+) for structural settling; a coarse dt aliases the response
  peak and the DMF.
- Placing the elastic axis at or aft of the aerodynamic center without
  re-checking relief: with e = 0.25 the static aeroelastic relief
  vanishes (q = 0) and the long-gradient DMF approaches 1.0 rather than
  0.837; e aft of 0.25 is the divergence regime owned by divergence-speed.
- Expecting the verdict margin sign convention to be positive on pass:
  peak_load_verdict returns margin = limit/peak - 1, so a negative
  margin means FAIL and a positive margin means PASS - do not flip the
  comparison when reading the verdict.

## Behavior contract (gate 3)

Run the deterministic contract test (stdlib unittest, offline):

    python3 scripts/test_aeroelastic_gust_response.py

The test covers the indicial coefficient values, the Wagner step-response
limits (0.5 at s = 0, unity at large s) and Kussner sharp-edge limits
(zero at s = 0, unity at large s), the one-minus-cosine gust angle shape
and peak, the lag-state step anchor (initial lift about 0.5 of the
quasi-steady value, convergence to the full value, match to the closed
form), the fully developed lift kernel and the zero-start gust channel,
the quasi-steady peak lift formula, the dynamic magnification factor, the
peak-load verdict PASS/FAIL/margin logic, the worked-example peak and DMF,
the long-gradient bands, the monotonic DMF trend with gradient length,
quiescence with no gust, linear scaling with gust velocity, and ValueError
rejection of every non-physical input class.

## Compliance

- Standards referenced, not reproduced: the FAR 25 and CS 25 gust-load
  rules frame the certification context; the indicial aerodynamics and
  typical-section relations above are standard engineering methodology,
  summary-only per standards-map.yaml.
- compliance: STANDARDS-REF, gated: false.

