Skip to content

Take the billow axis from the section pair, not a global projection - #264

Merged
1-Bart-1 merged 1 commit into
mainfrom
fix/billow-axis-span-order
Aug 22, 2026
Merged

Take the billow axis from the section pair, not a global projection#264
1-Bart-1 merged 1 commit into
mainfrom
fix/billow-axis-span-order

Conversation

@1-Bart-1

Copy link
Copy Markdown
Member

Problem

Billowing rotates each refined section's trailing edge about the leading-edge
span vector of the surrounding rib pair. The sign of that vector decides
whether the panel billows up or down, and it was chosen by projecting on
wing.spanwise_direction:

if dot(s_l.LE_point - s_r.LE_point, wing.spanwise_direction) >= 0
    le_neg, le_pos = s_r.LE_point, s_l.LE_point
else
    le_neg, le_pos = s_l.LE_point, s_r.LE_point
end

That test is well-conditioned only where the span vector is actually spanwise.
On a C-shaped kite the tip panels are nearly vertical, so their leading-edge
span vector is mostly x and z. Measured on the V3 kite's 37-section aero
geometry (spanwise_direction = [0, 1, 0], LE y running +4.167 → −4.167):

pair |y_hat · spanwise_direction|
1 (tip) 0.033
2 0.071
3 0.115
4–33 0.23 – 1.00
34 0.115
35 0.071
36 (tip) 0.033

The outermost pair is separated by 11 mm of span. Since refine! re-runs on
the deformed sections each aero update, a flexing tip only has to move two
adjacent leading-edge nodes 11 mm relative to each other in y for that one
panel's billow to invert while its neighbours keep theirs.

Fix

Sections are guaranteed to run +y to -y (normalize_span_order! /
refine!'s sort_sections), so the pair itself fixes the axis sign with no
projection and no degeneracy:

diff_vec = s_l.LE_point - s_r.LE_point

spanwise_direction still sets the wing's overall handedness once, where it is
well-conditioned; it no longer decides each panel individually.

Effect

On a geometry whose tips are not near-vertical the two rules agree, so the
refined mesh is unchanged. On the V3 geometry above the old test also happened
to agree on all 36 pairs in the undeformed mesh — the change is a no-op there
— but it removes the 3 % margin the tip panels were relying on.

🤖 Generated with Claude Code

Billowing rotates each section's trailing edge about the leading-edge span
vector, and the sign of that vector decided whether the panel billows up or
down. It came from projecting on `spanwise_direction`, which is near-degenerate
where the span vector is not spanwise: on a C-shaped kite's tip panels the
alignment is 0.033, 11 mm of span between the outermost sections, so a
deforming tip could flip one panel's billow while its neighbours kept theirs.

Sections run +y to -y, so the pair itself fixes the sign with no projection
and no degeneracy. On a wing whose tips are not near-vertical the two agree,
so the refined mesh is unchanged there.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@codecov

codecov Bot commented Aug 22, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.

📢 Thoughts on this report? Let us know!

@1-Bart-1
1-Bart-1 merged commit c88bb46 into main Aug 22, 2026
9 checks passed
@1-Bart-1
1-Bart-1 deleted the fix/billow-axis-span-order branch August 22, 2026 13:53
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant