panel_inflow forms the polar-lookup angle from the full relative velocity:
v_eff = 0.5 .* (va_1 .+ va_2) .+ v_ind
alpha = atan(dot(v_eff, z_airf), dot(v_eff, x_airf))
(src/panel_aerodynamics.jl:119-120, and open-coded on the hot path at src/solver.jl:749-759.)
Gaunaa, Li & Pirrung, From thin airfoil theory to finite wings: consistent implementation of Lifting Line-based models, TORQUE 2026, J. Phys. Conf. Ser. 3224 042030 (OpenSourceAWE/Internal Papers/Gaunaa_2026.pdf) states the rule as CP1, boxed, p. 3:
Only the relative velocity component perpendicular to the local span direction, here defined as the quarter-chord bound vortex line, should be used in the inner 2D part of the LL framework.
and writes it as Eq. (1), p. 4, applied before the angle is formed:
V^⊥_{3D,i} = V{3D,i} − (V{3D,i} · e{s,i}) e{s,i}
α_{3/4,i} = atan2(V{inner,3/4,i} · e{n,i}, V{inner,3/4,i} · e{c,i}) (Eq. 3, p. 5)
The projection is missing here. It matters only in the denominator: z_airf is already perpendicular to the quarter-chord line, so dot(v, z_airf) == dot(v_perp, z_airf) exactly, but x_airf is the raw chord and carries a spanwise component on any swept panel.
Half of the rule is already obeyed elsewhere in the same function. The dynamic pressure is built from v_span = cross(v_eff, y_airf) (src/panel_aerodynamics.jl:121, v_a_dist at src/solver.jl:731-766), which is the span-perpendicular speed — simple sweep theory's cos²Λ about the quarter-chord line. So q is measured in the crossflow plane and alpha is not.
Size
On the swept, twisted panel test/panel/test_panel.jl already builds, where the chord sits 45.128° out of the span-perpendicular plane (cos(sweep) = 0.705526):
v_eff |
alpha today |
Eq. (1) then Eq. (3) |
[1, 0, 0] |
−14.299° |
−27.411° … −20.097° |
[1, 0.3, 0] |
−13.473° |
−35.422° … −26.647° |
[1, 0, 0.1] |
−20.003° |
−36.679° … −27.721° |
[1, 0.3, 0.1] |
−19.205° |
−46.540° … −36.668° |
The range in the right-hand column is a genuine ambiguity in the paper, not measurement slop: it never defines e_c,i by equation, and the word "project" does not occur in it. Taking e_c,i as the raw chord unit vector gives the left figure; taking it as the chord re-normalised inside the span-perpendicular plane gives the right one, smaller by cos(sweep). Both are 13–27° from what the solver does now.
Over the reference wings at N=40, the largest angle between chord and the span-perpendicular plane is 15.86° (:rectangular), 0.00° (:curved), 0.00° (:elliptical) — and test/thesis_oriol_cayon.jl forms alpha the same way the solver does, so the suite pins whichever convention is chosen and cannot see this.
What I would do
Apply Eq. (1) to v_eff in panel_inflow before the atan, and take e_c,i as the chord re-normalised in that plane, so that alpha, q_dyn and z_airf are all measured about the same line. That needs deciding, because the paper leaves e_c,i open and because it moves every swept panel's polar lookup — it wants a swept, tapered validation case with a known answer, which the suite does not have. #273 deliberately left it alone.
This was raised for the record as item 1 of "Related, possibly by design" on #272, where it was pinned on y_airf rather than on x_airf; #272's item 2 there is already out of date, since q is the crossflow one. It gets its own issue because CP1 turns it from a question into a defect. Found while checking #273 against this paper.
panel_inflowforms the polar-lookup angle from the full relative velocity:(
src/panel_aerodynamics.jl:119-120, and open-coded on the hot path atsrc/solver.jl:749-759.)Gaunaa, Li & Pirrung, From thin airfoil theory to finite wings: consistent implementation of Lifting Line-based models, TORQUE 2026, J. Phys. Conf. Ser. 3224 042030 (
OpenSourceAWE/InternalPapers/Gaunaa_2026.pdf) states the rule as CP1, boxed, p. 3:and writes it as Eq. (1), p. 4, applied before the angle is formed:
The projection is missing here. It matters only in the denominator:
z_airfis already perpendicular to the quarter-chord line, sodot(v, z_airf) == dot(v_perp, z_airf)exactly, butx_airfis the raw chord and carries a spanwise component on any swept panel.Half of the rule is already obeyed elsewhere in the same function. The dynamic pressure is built from
v_span = cross(v_eff, y_airf)(src/panel_aerodynamics.jl:121,v_a_distatsrc/solver.jl:731-766), which is the span-perpendicular speed — simple sweep theory'scos²Λabout the quarter-chord line. Soqis measured in the crossflow plane andalphais not.Size
On the swept, twisted panel
test/panel/test_panel.jlalready builds, where the chord sits 45.128° out of the span-perpendicular plane (cos(sweep) = 0.705526):v_effalphatoday[1, 0, 0][1, 0.3, 0][1, 0, 0.1][1, 0.3, 0.1]The range in the right-hand column is a genuine ambiguity in the paper, not measurement slop: it never defines
e_c,iby equation, and the word "project" does not occur in it. Takinge_c,ias the raw chord unit vector gives the left figure; taking it as the chord re-normalised inside the span-perpendicular plane gives the right one, smaller bycos(sweep). Both are 13–27° from what the solver does now.Over the reference wings at N=40, the largest angle between chord and the span-perpendicular plane is 15.86° (
:rectangular), 0.00° (:curved), 0.00° (:elliptical) — andtest/thesis_oriol_cayon.jlforms alpha the same way the solver does, so the suite pins whichever convention is chosen and cannot see this.What I would do
Apply Eq. (1) to
v_effinpanel_inflowbefore theatan, and takee_c,ias the chord re-normalised in that plane, so thatalpha,q_dynandz_airfare all measured about the same line. That needs deciding, because the paper leavese_c,iopen and because it moves every swept panel's polar lookup — it wants a swept, tapered validation case with a known answer, which the suite does not have. #273 deliberately left it alone.This was raised for the record as item 1 of "Related, possibly by design" on #272, where it was pinned on
y_airfrather than onx_airf; #272's item 2 there is already out of date, sinceqis the crossflow one. It gets its own issue because CP1 turns it from a question into a defect. Found while checking #273 against this paper.