Skip to content

Panel normal z_airf is built from the leading-edge step, not the quarter-chord step the bound vortex uses #272

Description

@1-Bart-1

Summary

In panel_axes (src/panel_aerodynamics.jl:58-69) the panel's spanwise axis, its
width and its bound filament all come from the quarter-chord step, but the
normal comes from the leading-edge step:

span_vec = panel_span_vector(le_1, te_1, le_2, te_2)   # 0.75·le + 0.25·te
width    = smooth_norm(span_vec)
x_airf   = chord_vec ./ smooth_norm(chord_vec)
y_airf   = orient .* (span_vec ./ width)
z_cross  = cross(x_airf, le_1 .- le_2)                 # <-- leading edge, not quarter chord
z_airf   = orient .* (z_cross ./ smooth_norm(z_cross))

panel.bound_point_1/2 and filaments[1] lie on the quarter-chord line, so
z_airf is not perpendicular to the vortex line the circulation sits on. The
effective angle of attack is taken against that normal
(src/solver.jl:717-726, atan(v·z_airf, v·x_airf)), so a rotation of z_airf
about x_airf feeds straight into every panel's alpha.

Size of the discrepancy

Measured on a 44-panel ram-air kite (SK100, strongly raked tip), settled under
load. Second column is the angle between z_airf and normalize(x_airf × (bound_point_2 − bound_point_1)):

panel   LE step vs QC step   z_airf vs QC-plane normal   sweep(QC)
   1           6.97°                   5.58°               48.8°
   4           7.68°                  13.44°               57.2°
   5          10.26°                   7.21°               12.4°
  20           1.71°                   1.40°                1.5°
  41           7.83°                  13.82°              -57.2°
  44           6.98°                   5.71°              -48.7°

Near zero at the root, ~7° over most of the span, up to 13.8° on the outer
panels. It grows with taper, so it is largest exactly where the chord is
shortest and the panels are most sensitive.

Suggested fix

Take both from the same span reference:

z_cross = cross(x_airf, -span_vec)

If the leading-edge step is deliberate — it tracks the physical LE, arguably the
better reference for a cambered section's plane — then the bound filament
arguably ought to follow it too. Either way, mixing the two references inside one
frame looks unintended.

Related, possibly by design

Two things in the same area that only bite at high sweep, raised for the record
rather than as defects:

  1. y_airf is not orthogonalised against x_airf. On the tip panels above,
    x_airf · y_airf is 0.84, so projecting the velocity onto x_airf does not
    remove the spanwise component, and the three axes do not decompose a vector
    (the sum of the squared projections exceeds |v|²).
  2. Sections are looked up in their 2D polars at atan(v·z_airf, v·x_airf) with
    the full local dynamic pressure. Classical swept-wing theory feeds a section
    the flow normal to the quarter-chord line with q scaled by cos²Λ. At the
    8-13° of sweep a conventional wing carries this is negligible; on panels at
    57° it is not.

Both are irrelevant on a conventional planform and become significant on a
strongly raked kite tip, where a single straight bound filament can span a bay
whose quarter-chord line is genuinely curving.

Version

main @ v4.3.1, src/panel_aerodynamics.jl:58-69.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions