Summary
write_polar_matrix_csv (src/airfoil_aero/airfoil_solvers/common.jl:62) writes every coefficient with @sprintf("%.4f"). On a kite section Cd ≈ 0.009, so the quantum is about 1% of the value, and the drag response to a trailing-edge deflection disappears into it: a 1° flap moves Cd by roughly 2e-5, which rounds away entirely.
Measured on data/ram_air_kite/ram_air_kite_body.obj through obj_to_yaml (NeuralFoil, Re=1e6, alpha_range=-1:1:1, delta_range=-1:1:1, all in degrees). Two consecutive delta blocks of one section's table:
alpha,delta,Cl,Cd,Cm
-1.0000,0.0000,-0.3019,0.0093,0.0605
0.0000,0.0000,-0.1878,0.0089,0.0614
1.0000,0.0000,-0.0717,0.0088,0.0619
-1.0000,1.0000,-0.2640,0.0093,0.0502
0.0000,1.0000,-0.1495,0.0089,0.0511
1.0000,1.0000,-0.0330,0.0088,0.0515
Cl moves by 0.038 and Cm by 0.010; the Cd column is identical, digit for digit. Through Wing + BodyAerodynamics that makes the panel's ∂Cd/∂delta exactly 0.0 over ±1° — maximum(abs, cd_interp.(alphas, deg2rad(1)) .- cd_interp.(alphas, 0.0)) == 0.0 on the outboard panels. Where a panel does show a difference it is a single unit in the last written decimal (1.0e-4), picked up from one bracketing section rounding to 0.0099 against the other's 0.0098.
At the default delta_range=-3:3:3 the deflection spans a few quanta rather than none, so the derivative is not zero there — it is quantised to about 1e-4 steps.
Why it matters
Any POLAR_MATRICES wing built through obj_to_yaml carries no usable drag response to control-surface deflection at small angles, and a coarsely quantised one at larger angles. Anything differentiating or trimming on deflection reads that as zero drag sensitivity.
It also made a test assert a coin flip: test/plotting/test_plotting.jl's "POLAR_MATRICES panel is evaluated at the passed delta" guarded the deflection with @test deflected[2] != stored[2] on Cd. That held on main only through the one-quantum rounding above; #350 re-slices the fixture, the two bracketing sections then round identically, and the assertion went red. #350 moves the guard onto Cl, which carries the deflection with margin to spare, but the underlying table stays as coarse as it is.
What I would do
Write the coefficient columns with enough digits to carry the solver's own resolution — %.6f, or %g to drop the padding — and regenerate. The same writer covers Cl and Cm, which lose less but lose it the same way. Existing generated tables would have to be regenerated to benefit; nothing errors if they are not.
Summary
write_polar_matrix_csv(src/airfoil_aero/airfoil_solvers/common.jl:62) writes every coefficient with@sprintf("%.4f"). On a kite sectionCd ≈ 0.009, so the quantum is about 1% of the value, and the drag response to a trailing-edge deflection disappears into it: a 1° flap movesCdby roughly2e-5, which rounds away entirely.Measured on
data/ram_air_kite/ram_air_kite_body.objthroughobj_to_yaml(NeuralFoil,Re=1e6,alpha_range=-1:1:1,delta_range=-1:1:1, all in degrees). Two consecutivedeltablocks of one section's table:Clmoves by 0.038 andCmby 0.010; theCdcolumn is identical, digit for digit. ThroughWing+BodyAerodynamicsthat makes the panel's∂Cd/∂deltaexactly0.0over ±1° —maximum(abs, cd_interp.(alphas, deg2rad(1)) .- cd_interp.(alphas, 0.0)) == 0.0on the outboard panels. Where a panel does show a difference it is a single unit in the last written decimal (1.0e-4), picked up from one bracketing section rounding to0.0099against the other's0.0098.At the default
delta_range=-3:3:3the deflection spans a few quanta rather than none, so the derivative is not zero there — it is quantised to about 1e-4 steps.Why it matters
Any
POLAR_MATRICESwing built throughobj_to_yamlcarries no usable drag response to control-surface deflection at small angles, and a coarsely quantised one at larger angles. Anything differentiating or trimming on deflection reads that as zero drag sensitivity.It also made a test assert a coin flip:
test/plotting/test_plotting.jl's "POLAR_MATRICES panel is evaluated at the passed delta" guarded the deflection with@test deflected[2] != stored[2]onCd. That held onmainonly through the one-quantum rounding above; #350 re-slices the fixture, the two bracketing sections then round identically, and the assertion went red. #350 moves the guard ontoCl, which carries the deflection with margin to spare, but the underlying table stays as coarse as it is.What I would do
Write the coefficient columns with enough digits to carry the solver's own resolution —
%.6f, or%gto drop the padding — and regenerate. The same writer coversClandCm, which lose less but lose it the same way. Existing generated tables would have to be regenerated to benefit; nothing errors if they are not.