| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
Sorry, something went wrong.
A section rotating about its own spanwise axis sees an incidence that varies linearly along the chord. In thin airfoil theory that is the same boundary condition as parabolic camber, giving A1 = q*c/(2V) and A2 = 0, hence cm_c/4 = (pi/4)(A2 - A1) = -(pi/4) q_hat. The lift half of the same effect was already exact: A0 + A1/2 collapses to the effective incidence at three-quarter chord, which is where the inflow is sampled, so no correction belongs there. Only the moment was missing, and one control point per section cannot represent it because it is an A1 term rather than an A0 shift. What the moment responds to is the chordwise gradient of normal velocity across a panel. For rigid motion that gradient is omega . y_airf, but a deforming wing has a twist rate that varies along the span and no single body rate expresses it. BodyAerodynamics therefore carries pitch_rate_dist, one rate per panel: the rigid set_va! fills it by projection, the distributed set_va! takes it as a keyword, and section_pitch_rate builds an entry from a section's edge velocities. That helper reduces to omega . y_airf for rigid motion, so the sign convention is pinned in one place rather than rediscovered by every caller. Omitting the keyword zeroes the rates. The distributed set_va! never set omega, so reading it there would have fed the moment a stale rate. Off by default, applied in both force paths: calc_forces! behind solve! and calculate_results behind solve. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Arrow became a direct dependency but never reached either default manifest, so seeding a fresh checkout from them left the package unloadable. Regenerated both with bin/install --update, which also carries the routine version bumps that had accumulated since the last refresh. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Regenerating the default manifests needs one resolve per supported Julia version, but bin/install could only be pointed at a version through a stdin menu, and it moved the juliaup default to get there — so refreshing the 1.11 manifest left the shell on 1.11 afterwards. --version X.Y and +X.Y select the channel for one run and only juliaup add it, leaving the default alone. bin/update_default_manifests uses that to do both versions in one command, matching the script in SymbolicAWEModels.jl. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Codecov Report❌ Patch coverage is 95.45455% with 1 line in your changes missing coverage. Please review.
📢 Thoughts on this report? Let us know! |
Sorry, something went wrong.
Documenter parses [flow_curvature_cm](@ref) as emphasis, so the link text reaches cross-reference resolution as flow*curvature*cm and the docs build fails. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
flow_curvature_cm rests on cm_c/4 = (pi/4)(A2 - A1), which nothing in the suite pinned: the existing tests check the code matches that formula, not that the formula is right, so a sign or factor error in it would pass everything and be wrong by exactly that amount everywhere. A rotating section is the A1 = q c / (2 v_rel), A2 = 0 case of the same relation. Applying it instead to NACA 4-digit mean lines, where measured section values exist, gives -0.053 for the 2412 against a measured -0.047 and -0.106 for the 4412 against -0.093, both inside the accuracy thin airfoil theory is expected to have, and exactly zero for the symmetric 0012. The zero-lift angle is asserted from the same coefficients so an error cannot hide in the moment alone. Relation and coefficient definitions: MIT OCW 16.01 Unified Engineering, Fluids Lecture 3 notes pp. 2-3. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
| Back | FazBrowse Home | New Git URL |
Adds an opt-in flow_curvature solver setting (default false) giving each
section the thin-airfoil pitch-rate moment increment, driven by a per-panel rate
so deformation modes reach it.
What is missing today
A section rotating about its own spanwise axis at rate q sees an incidence that
varies linearly along the chord, α_eff(x) = α + q(x − x_p)/V. Thin airfoil theory
cannot tell that apart from parabolic camber, so the Fourier coefficients pick up
The lift half is already exact in VSM: Cl = 2π(A₀ + A₁/2) = 2π[α + (q/V)(3c/4 − x_p)]
is just the effective incidence at three-quarter chord — precisely where set_va!
samples the inflow (control_points = LE·0.25 + TE·0.75). Nothing to fix there.
The moment is not, because it lives in A₁ rather than A₀:
One control point per section can represent an incidence but not an incidence
gradient. A chordwise-refined VLM recovers this from the discretisation; a
lifting line has to add it analytically. It is independent of the pivot (x_p
only enters A₀), so only the rate is needed — the arm effect is already handled
by the existing (aero_center − reference_point) × F sum.
Per-panel rates
What the moment responds to is the chordwise gradient of normal velocity across a
panel. For rigid motion that gradient is ω ⋅ y_airf, but a deforming wing has a
twist rate that varies along the span and no single body rate expresses it — which
matters because this moment is largest exactly there (a strip's torsional inertia
is small while the moment scales with c²).
So the input is the gradient, not a body rate:
panels at different dihedral see different rates from one body rate.
exported, builds one entry from a section's edge velocities.
section_pitch_rate reduces exactly to ω ⋅ y_airf under rigid motion
(v_TE − v_LE = ω × c·x_airf, and y × x = −z), so one expression covers both
cases and the sign convention — where an error flips damping into divergence — is
pinned in one place instead of being rediscovered by each caller.
It also closes a trap: the distributed set_va! never set omega, so reading it
there would have used a stale rate. Omitting the keyword now zeroes it.
Verification
the aero centre gains a positive z_airf velocity component, i.e. more
incidence, matching the derivation.
(predicted 19.24 N·m at the test condition, measured 19.245).
cm_dist increments matching flow_curvature_cm, opposite signs on the two
half-wings, length mismatch throwing.
the code. A rotating section is the A₁ = q c/(2 v_rel), A₂ = 0 case of
cm_c/4 = (π/4)(A₂ − A₁); applying the same relation to NACA 4-digit mean
lines gives −0.053 for the 2412 against a measured −0.047, −0.106 for the
4412 against −0.093, and exactly zero for the symmetric 0012. The zero-lift
angle is asserted from the same coefficients (−2.08° against a measured
−2.1°), so a sign or factor error cannot hide in the moment alone.
Applied in both force paths — calc_forces! behind solve! and
calculate_results behind solve.
Caveats
apparent-mass part (−(π/2) q̂) is larger and belongs in the dynamics layer.
dependency without reaching either, so seeding a fresh checkout from them left
it unloadable. Unrelated to the physics change.
References
The relation this rests on, and the coefficient definitions used above:
Only the substitution of the rotation-induced camber slope into those definitions
is done here; the integrals are in the description above and the resulting
relation is exercised against measured section data in the test suite.
For the apparent-mass term named in the caveats, which this PR does not add:
Eq. (III) carries the π(1/8 + a²)b²α̈ and baπḧ terms, i.e. the added moment of
inertia about the rotation axis and the added-mass force acting at midchord —
the −(π/2) q̂ moment and the added-mass matrix discussed above both follow from
it. Note NTRS catalogues the scan under 1949, the year of the Annual Report
volume it was reprinted in; the report itself is 1935.
🤖 Generated with Claude Code