Changelog#
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
[2.0.1] - 2026-05-29
Changed
Plot figure titles and subplot labels improved: plain-English titles, Force/Moment distinction, full perturbation-variable names,
.avlsurface names instead of internal keys (#8)Doc cleanup in Quickstart and Concepts
[2.0.0] - 2026-05-23
Added
AeroDatabase.stab_deriv(30 stability derivatives) andctrl_deriv(6 × n_surfaces control derivatives), populated from neutral-control runsplot_stab_derivs(aero)andplot_ctrl_derivs(aero)plot functionsCLI
plot stab-deriv,plot ctrl-deriv, andplot allsubcommandsstab_deriv_to_dataframeandctrl_deriv_to_dataframehelpers
Changed
AeroDatabase.stab→total_stab;AeroDatabase.ctrl→total_ctrl(breaking)aero_fileplot→plot_totals;aero_stabderivplot→plot_stab_derivs;aero_ctrlderivplot→plot_ctrl_derivs(breaking)All plot functions return
dict[str, Figure]instead oflist[Figure](breaking)plot aeroCLI subcommand renamed toplot totals;--beta-ref DEGadded (breaking)Output filenames:
results.csv→results_total.csv,results_stab_deriv.csv→results_deriv_stab.csv,results_ctrl_deriv.csv→results_deriv_ctrl.csv(breaking)Axis labels use Unicode (α β p′ q′ r′) instead of LaTeX strings
Fixed
Plot titles no longer mislabel total-coefficient plots as derivatives
Plotly WebGL context exhaustion in sphinx-design tabs; fixed with an
IntersectionObserverindocs/_static/custom.js
[1.8.0] - 2026-05-20
Added
End-to-end integration tests covering all CLI commands and the full Python API chain against the real AVL binary
CLI requirements table (
docs/dev/reqs/cli.csv) with 33 entries
Fixed
plot aerofailed on a parent directory because the CLI was double-stamping the output path;_runs/<yml-stem>/now passed directly toavl_sweepwhich owns the timestamped subdirectory
Removed
docs/_static/custom.js— dead code (Plotly figures are iframed; parent-page resize handler never fired)
[1.7.0] - 2026-05-20
Added
Structured logging via Python
loggingmodule throughoutavl_aero_tablesPer-run log file written to
{run_dir}/{avl_name}.logon every sweep (always, regardless of--quiet); captures WARNING and above from the whole packageRich indeterminate spinner during the blocking AVL subprocess call; shown only in a TTY, suppressed when piped or
--quietrichadded to core dependencies
Changed
verbosemodule flag removed; console output is now controlled by the standard Python logging system — API users calllogging.basicConfig(level=logging.INFO)to enable it, orlogging.getLogger("avl_aero_tables").setLevel(logging.WARNING)to suppressCLI
--quiet/-qsuppresses the console logging handler (log file is still written)_ensure_neutral_in_sweeps0.0 auto-insertion now emits_log.warning()instead ofwarnings.warn(UserWarning), so it appears in the run log fileaero_filewriteverbose summary print removed (was redundant with user-supplied sweep parameters)Quickstart docs: all CLI and Python API examples use unified Input/Output card layout
[1.6.0] - 2026-05-16
Changed
Plotly modebar always visible; styled with vertical orientation and translucent background
Geometry figure whitespace tightened; view buttons (Iso / Right / Front / Top) with corrected camera positions; Iso camera reoriented so nose points toward the viewer (lower-right)
Aero coefficient figure margins and title centering improved;
CAMERA_AEROconstant added to_plot_configQuickstart docs: MyST comments added pointing to plot regeneration scripts
[1.5.0] - 2026-05-16
Added
_plot_config.py— shared Plotly constants (AXIS_3D, camera defaults, colorscales, opacity); all plot modules import from hereequal_3d_ranges()helper extracted to_plot_configfor reusectrl_sweepsentries missing0.0now trigger aUserWarningand auto-insert it, ensuring stability tables are always populatedCoordinate triads on geometry plot (AVL world frame + aircraft body frame at CG); legend distinguishes the two frames
Sphinx plotly figures embedded as lazy-loading iframes;
:height:and:class:options on theplotly-figuredirective
Changed
avl_fileplot: single interactive 3-D scene replaces four-panel static view; equal-axis scaling; background planes removedaero_fileplot: consistent margins and subplot title sizing
Fixed
CLI sweep output directory regression (
runs/→_runs/)Geometry
SCALEtransformation now applied before plotting (previously onlyTRANSLATEwas applied)
[1.4.0] - 2026-05-16
Added
avl_config.py— Pydantic models (ProjectConfig,InputSpec,SweepSpec,OutputSpec) andload_config(); YAML validation with clear error messagesYAML-driven CLI:
sweep <yml>,plot geometry <yml>,plot aero <runs_dir>avl_fileplotandaero_fileplotrewritten for Plotly; interactive figures embed in Sphinx and Dashexamples/b737.py— Boeing 737-800 end-to-end walkthrough with--docsflagplotlyadded to core dependencies
Changed
Quickstart restructured: CLI section uses Bubble Dancer, Python API section uses B737
examples/quickstart.pyrenamed toexamples/bd.py
[1.3.0] - 2026-05-16
Added
Structured run output:
.in/(inputs + geometry snapshot),.raw/(.stfiles),provenance.json(timestamp, version, git state, entry point)--versionCLI flag
Changed
sweep.log→sweep.inp, moved to.in/;reset.runandcase_*.streorganized into.in/and.raw/
[1.2.0] - 2026-05-15
Added
examples/bd.pyend-to-end walkthrough with--docsflag
Changed
plot aeroaccepts a parent<runs_dir>(latest run auto-selected) instead of a.ymlavl_sweep()out_diris a base directory; timestamped subdirectory created automaticallyAVL invoked as pure stdin script (
avl < script);LOAD/CASEcommands at top of scriptexamples/reorganized into per-aircraft subdirectories with co-located airfoil data
[1.1.0] - 2026-05-15
Added
YAML project file schema (
input,sweep,outputsections); Pydantic validationsweep <yml>,plot geometry <yml>,plot aero <runs_dir>CLI subcommandsProject files for all seven reference aircraft
Removed
mass_fileparameter (not needed for.stvortex-lattice output)run <command_file>CLI subcommand
[1.0.1] - 2026-05-15
Fixed
Add missing
docs/dev/reqs/sweep.csv(was excluded by an overly broad.gitignorepattern), docs action fix!Remove unused
sphinx.ext.intersphinxextension and its four network fetches at build time
[1.0.0] - 2026-05-09 to 2026-05-15
Added
docs/dev/requirements.md— per-module behavioral requirements derived from the test suite, rendered as eightcsv-tablesections (one per module)docs/dev/reqs/— eight source CSVs (geom,stab,cmd,bin,sweep,plot,write,aeroplot), each withid,requirement,rationale, andtestcolumns; test column links to the covering function on GitHub@pytest.mark.req("req-xxx")decorators on all 84 requirement-linked tests;tests/conftest.pyprints a requirement-coverage summary at the end of every runSphinx docs site deployed to GitHub Pages: getting-started, usage, API reference, roadmap, contributing, changelog, and embedded AVL upstream reference
GitHub Actions workflow for automatic docs deployment on push to master; PyPI publish workflow
CONTRIBUTING.mdwith dev setup, test, and docs-serve instructionsBubble Dancer example plots embedded in getting-started
Full Python port of all eight MATLAB modules into the
avl_aero_tablespackageavl_sweep()as the primary entry point;out_formatparameter writes results to"csv"(default),"json", or"df"(DataFrame in memory only)results_to_dataframe()convertslist[StResult]to a pandas DataFrame for tabular exportavl-aero-tablesCLI withverifyandrunsubcommandsGitHub Actions CI workflow; builds AVL 3.52 from source on Ubuntu on every push
172-test pytest suite with
--doctest-modules; all public functions have runnable docstring examplesmypy static type checking across all modules
File-based AVL inputs:
reset.run(AVL run-case format, all conditions zeroed) andsweep.cmd(full stdin command script) are written to the output directory before each run, so inputs and outputs are always on disk together; a run can be replayed manually withavl < sweep.cmdTimestamped output subdirectories (
out/<name>/YYYY-MM-DD-HHMMSS/) created by default so previous results are never overwritten; pass an explicitout_dirto write to a fixed location insteadavl_sweep()prints the output path and case count on completion:AVL sweep complete → out/bd/2026-05-15-143022 (12 cases)
Changed
Minimum Python version raised to 3.12; CI matrix updated to 3.12 and 3.13
README trimmed to a short landing page pointing at the docs site
GitHub repository and Python package renamed to
avl-aero-tables/avl_aero_tablesavl_aerogenrenamed toavl_sweep; CLI split fromavl_binintoavl_cliDocs restructured into
docs/user/anddocs/dev/sectionsaero_filewritestability tables populated only for neutral-control runs; fixes a known bug carried over from the MATLAB implementationaero_fileplotbeta-index lookup is now generic rather than hardcoded to a specific surface nameType annotations and error messages improved across all public functions
make_reset_run/make_commandrenamed tomake_run_reset/make_run_commandfor a consistentmake_run_prefixDefault
out_dirchanged from<avl_file_parent>/out/<name>/toout/<name>/relative to the current working directoryWhen an explicit
out_diris provided, only stale.stfiles are removed before the run; other files (e.g. a previousresults.csv) are left untouched
Removed
MATLAB source files (
.m) removed from working tree; originals preserved at git tagv0.0.0-matlabexamples/avl.exeWindows binary andtmp/directory (MATLAB holdovers)
[0.0.0] - 2014-08-28
Notes
Initial MATLAB-based implementation; see tag
v0.0.0-matlabModules:
avl.m,avl_fileread.m,avl_fileplot.m,avl_rungen.m,st_fileread.m,avl_aerogen.m,aero_filewrite.m,aero_fileplot.m