calculate_cl and calculate_cd in src/panel.jl jump at |α| = 20° for a POLY (Breukels) panel, and calculate_cm keeps its quadratic far past its fit range.
Past abs(alpha) > π/9, calculate_cl swaps the α-polynomial for 2cos α sin²α and calculate_cd swaps it for 2sin³α. Neither swap blends, so the value is discontinuous. calculate_cm has no such branch.
With lei_poly_coeffs(0.1, 0.08), through plot_section_polars from #354:
| α |
cl |
cd |
cm |
| 19.99° |
1.0706 |
0.1832 |
−2.4181 |
| 20.01° |
0.2200 |
0.0801 |
−2.4231 |
| 30.00° |
0.4330 |
0.2500 |
−5.5312 |
A solver iterate that crosses 20° sees a drop of 0.85 in cl, and the Newton-type solvers see a derivative that does not exist there.
What I would do: blend the polynomial into the post-stall form over a few degrees and give cm a bounded post-stall form too. That changes every existing POLY result near or beyond 20°, so it needs a decision on which post-stall model is intended before anyone writes it.
Found while checking the plot for #331.
calculate_clandcalculate_cdinsrc/panel.jljump at |α| = 20° for aPOLY(Breukels) panel, andcalculate_cmkeeps its quadratic far past its fit range.Past
abs(alpha) > π/9,calculate_clswaps the α-polynomial for2cos α sin²αandcalculate_cdswaps it for2sin³α. Neither swap blends, so the value is discontinuous.calculate_cmhas no such branch.With
lei_poly_coeffs(0.1, 0.08), throughplot_section_polarsfrom #354:A solver iterate that crosses 20° sees a drop of 0.85 in cl, and the Newton-type solvers see a derivative that does not exist there.
What I would do: blend the polynomial into the post-stall form over a few degrees and give cm a bounded post-stall form too. That changes every existing
POLYresult near or beyond 20°, so it needs a decision on which post-stall model is intended before anyone writes it.Found while checking the plot for #331.