Releases: awegroup/Vortex-Step-Method
v2.1.2
Further tweaking dynamic versioning with toml
Full Changelog: v2.1.1...v2.1.2
v2.1.1
Adding dynamic versioning to the toml
Full Changelog: v2.1.0...v2.1.1
v2.1.0
Short Summary: v2.0.3 -> main
This version omits commit history and focuses only on added data/ and examples/ files, plus src/ code changes.
Added Data Files
552files were added underdata/(no modified or deleteddata/files in this range).- Added files by dataset:
297indata/TUDELFT_V3_KITE255indata/paraglider_Belloc_2015- Added files by type:
252.vtk120.csv115.pdf58.dat3.yaml2.md1.py1.ods
Added Example Files
12files were added underexamples/:examples/TUDELFT_V3_KITE/save_polars.pyexamples/TUDELFT_V3_KITE/testing_center_of_pressure_calculation.pyexamples/neuralfoil/tutorial_running_nf.pyexamples/neuralfoil/neuralfoil_results/airfoil_01_comparison.pngexamples/neuralfoil/neuralfoil_results/airfoil_02_comparison.pngexamples/neuralfoil/neuralfoil_results/airfoil_03_comparison.pngexamples/neuralfoil/neuralfoil_results/airfoil_04_comparison.pngexamples/neuralfoil/neuralfoil_results/airfoil_05_comparison.pngexamples/neuralfoil/neuralfoil_results/airfoil_06_comparison.pngexamples/neuralfoil/neuralfoil_results/airfoil_07_comparison.pngexamples/paraglider_Belloc_2015/aoa_correction_V3_and_Belloc.pyexamples/paraglider_Belloc_2015/compare_to_experiment.py- Other non-added
examples/changes in this range:4modified,1deleted,1renamed.
src/ Code Changes
- Only two source files changed:
src/VSM/core/BodyAerodynamics.pyandsrc/VSM/core/Filament.py. - Net diff across these two files:
12insertions,10deletions.
src/VSM/core/BodyAerodynamics.py
- In center-of-pressure calculation, replaced projection-magnitude logic with a signed scalar:
- Removed
F_perp = F - dot(F, z_airf) * z_airfandF_perp_mag = norm(F_perp). - Removed the fallback branch for
F_perp_mag < 1e-12that forced CP to aerodynamic center. - Added
F_perp_mag = dot(cross(y_airf, F), z_airf). - Lever-arm calculation and clamping to chord bounds remain in place.
src/VSM/core/Filament.py
- In two induced-velocity branches, changed on-filament detection from exact equality to tolerance.
- Old:
jit_norm(r1Xr0) / jit_norm(r0) == 0 - New:
jit_norm(r1Xr0) / jit_norm(r0) < 1e-12 * epsilon - Updated in:
BoundFilament.velocity_3D_bound_vortexBoundFilament.velocity_3D_trailing_vortex
Full Changelog: v2.0.3...v2.1.0
v2.0.3
- In
Solver.py, Adjusting the defaultcore_radius_fractionfrom 1e-20*epsilon to 0.05, following: https://docs.nrel.gov/docs/fy19osti/72777.pdf and "van Garrel, A., “Development of a Wind Turbine Aerodynamics Simulation Module,” Tech. Rep. ECN-C–03-079, ECN, The Netherlands, August 2003." Using 5% of the filament length makes more sense than essentially never allowing the solver to reach inside a core radius. - In
Filament.py, Checking for filament below <1e-12, rather than equal to 0, to account for machine error pytestswas failing on drag comparison, because the new VSM predicts higher drag without the 3/4c to 1/4c correction. Tests have been adjusted: Pytests now run successfully.
What's Changed
- Changing core radius fraction to default 0.05 and adjusting for machi… by @jellepoland in #155
- adjusting tests, to accomodate new and higher drag predictions of vsm… by @jellepoland in #156
Full Changelog: v2.0.2...v2.0.3
v2.0.02
- #152 add test of correction (eae1cb6)
- Change aoa 1/4 correction as optional bool in solver, false by default (#152) (72439c8)
- changed tutorial (acbfc2c)
What's Changed
- Main2 by @jellepoland in #154
- Develop by @jellepoland in #153
Full Changelog: v2.0.1...v2.0.2
v2.0.1
What's Changed
- Updating a minus sign bug, and tweaking the evaluation of static stability derivatives by @jellepoland in #151
Full Changelog: v2.0.0...v2.0.1
Added
evaluate_stability_derivatives.pyexample script demonstrating the use of the new
compute_rigid_body_stability_derivatives()function for calculating aerodynamic stability derivatives, prints results at trim conditions in the kite reference frame (x-backward LE to TE, y-right from kite's perspective, z-up) and in the aircraft convention (x-forward, y-right, z-down).
Fixed
- Corrected a misplaced minus sign in the sideslip handling inside
BodyAerodynamics.va_initialize, restoring the intended sign convention for moment predictions and β-related stability derivatives.
v2.0.0
What's Changed
- updating change log for release v1.1.0 by @jellepoland in #145
- Fix URL and add ORCID for authors in CITATION.cff by @rschmehl in #146
- Update README.md by @jellepoland in #147
- Fixing major bug in calculation of projected surface area, added stability and so on by @jellepoland in #149
New Contributors
Full Changelog:
v1.1.0...v2.0.0
[2.0.0] - 08-10-2025
⚠️ Breaking Changes
API Changes in BodyAerodynamics
1. va.setter now requires keyword-only arguments:
The velocity setter has been completely redesigned to properly handle body angular rates and reference points. All arguments after va are now keyword-only.
Old usage (v1.1.0):
# Setting velocity with yaw rate (tuple format)
body_aero.va = (vel_app, yaw_rate)
# Or without yaw rate
body_aero.va = vel_appNew usage (v2.0.0+):
# Basic velocity setting (no body rates)
body_aero.va = vel_app
# With body rates (keyword arguments required)
body_aero.va = vel_app, roll_rate=p, pitch_rate=q, yaw_rate=r
# With custom reference point for rotational velocity
body_aero.va = vel_app, yaw_rate=r, reference_point=np.array([x, y, z])Migration guide:
-
Instead of setting it directly using
body_aero.va, you can instead useva_initialize()(see below) -
If you do want to directly set it, you could should write for full control over body rates:
body_aero.va = vel_app, roll_rate=p, pitch_rate=q, yaw_rate=r, reference_point=ref_pt
2. va_initialize() signature expanded:
The initialization method now accepts body angular rates and reference point.
Old signature (v1.1.0):
body_aero.va_initialize(Umag, angle_of_attack, side_slip, yaw_rate=0.0)New signature (v2.0.0+):
body_aero.va_initialize(
Umag,
angle_of_attack,
side_slip,
pitch_rate=0.0, # NEW
roll_rate=0.0, # NEW
reference_point=None # NEW
)Migration guide:
- The
yaw_rateparameter has been removed - Body rates are now specified via
pitch_rate,roll_ratekeywords - If you need yaw rate, use
pitch_rateparameter (body-fixed z-axis) - Most existing code will work without changes if you weren't using
yaw_rate - If you were using
yaw_rate, replace with appropriate body rate:# Old body_aero.va_initialize(Umag, alpha, beta, yaw_rate=0.5) # New (yaw is rotation about body z-axis = pitch_rate) body_aero.va_initialize(Umag, alpha, beta, pitch_rate=0.5)
3. Rotational velocity calculation changed:
The method for computing rotational velocity contributions has been fundamentally updated:
- Old behavior: Simple uniform yaw rate applied
- New behavior: Proper rotational velocity field:
v_rot = omega × (r - r_ref)- Accounts for all three body angular rates (roll, pitch, yaw)
- Reference point can be specified (defaults to panel centroids)
- Physically accurate velocity field due to body rotation
Impact:
- Results involving body angular rates will differ from v1.1.0
- New results are physically more accurate
- If comparing with v1.1.0 results, expect differences in cases with non-zero angular rates
4. New property: _body_rates
Body angular rates are now stored and accessible via _body_rates property:
p, q, r = body_aero._body_rates # [roll_rate, pitch_rate, yaw_rate]Added
New Modules
1. stability_derivatives.py
- Compute rigid-body aerodynamic stability derivatives
- Function:
compute_rigid_body_stability_derivatives() - Supports derivatives w.r.t. angle of attack (α), sideslip (β), and body rates (p, q, r)
- Optional non-dimensionalization of rate derivatives
- Uses central finite differences for accuracy
- See
docs/StabilityDerivatives.mdfor detailed documentation
2. trim_angle.py
- Find trim angle of attack where pitching moment equals zero
- Function:
compute_trim_angle() - Two-phase algorithm: coarse sweep + bisection refinement
- Automatic stability verification
- Configurable convergence tolerances
- See
docs/TrimAngle.mdfor detailed documentation
New Documentation
docs/StabilityDerivatives.md- Comprehensive guide to stability derivative computationdocs/TrimAngle.md- Guide to trim angle finding with examplesdocs/README.md- Updated documentation index with quick-start guide- Enhanced main
README.mdwith Quick Start, Key Features, and Troubleshooting sections
New Examples
examples/TUDELFT_V3_KITE/tow_angle_geometry.py- Visualize effect of tow angle on kite geometryexamples/TUDELFT_V3_KITE/tow_point_location_parametric_study.py- Study tow point location effectsexamples/TUDELFT_V3_KITE/kite_stability_dynamics.py- Demonstrate stability derivative computation
Fixed
- Projected area calculation now uses correct trapezoidal integration method
- Reference point handling in rotational velocity calculations
v1.1.0
CHANGELOG [1.1.0] - 2025-09-26
⚠️ Breaking Changes
- Class rename:
WingAerodynamics→BodyAerodynamics. - Dataset path rename:
TUDELFT_V3_LEI_KITE→TUDELFT_V3_KITE. - Polar input format update:
- 3D:
alpha, CL, CD, CM - 2D:
alpha, Cl, Cd, Cm(note the capitalization difference)
- 3D:
- Defaults & options:
- Default spanwise panel distribution →
uniform - Removed options/attributes:
using_previous gamma,min_relaxation_error,is_new_vector_definition.
- Default spanwise panel distribution →
- Stall model refactor: Simonet-related stall logic moved out of
Solverintosolver_functionsand a dedicated stall branch.
Added
-
AirfoilAerodynamics framework
- New base class
AirfoilAerodynamics(parent for all airfoil types). masure_regressionairfoil with on-disk caching for fast reuse.- YAML configuration input for airfoil definitions.
- New tests for
AirfoilAerodynamics.
- New base class
-
LEI parametric model (masure_regression_lei_parametric)
- Examples showing how to reconstruct a LEI airfoil using 6 parameters:
t, eta, kappa, delta, lambda, phi. - Utilities for generating airfoil geometry and exporting .csv / .dat.
- Examples showing how to reconstruct a LEI airfoil using 6 parameters:
-
Half-wing inputs
- Support for half-wing inputs in both polar generation and geometry CSV export.
-
Plotting & tutorials
- Improved convergence plotting utilities.
- New sensitivity analysis examples & script (
sensitivity_analysis.py). - Updated tutorials (usage, sensitivity, convergence workflows).
- Interactive Plotly visualization environment.
- Moment calculations + plotting (incl. user-defined reference point).
- Panel polar investigation function.
-
Solver & VSM pipeline
Solvergains artificial viscosity (property + setter).- Added non-linear gamma loop variants and gamma loop type selector.
- New
compute_aerodynamic_quantitieshelper. - New initial gamma distribution options:
elliptical,cosine,zero. BodyAerodynamics:- Added/renamed circulation helpers:
calculate_circulation_distribution_elliptical_wingcalculate_circulation_distribution_cosine
- Added/renamed circulation helpers:
- Panel:
- New property:
panel_polar_data. - New
_panel_aero_modeloption:"cl_is_pisinalpha".
- New property:
-
Validation & examples
- Added elliptical wing planform test (Simonet ch. 4.1).
- Added rectangular wing test.
- NeuralFoil integration for cross-checking polars.
- Git now ignores
results/.
-
Bridle line forces
- Support for inputs like:
bridle_line1 = [p1, p2, diameter]wherep1 = [x, y, z]bridle_lines = [bridle_line1, bridle_line2, ...]
BodyAerodynamicsAPI sugar:instantiate_body_aerodynamicsfunctionBodyAerodynamics.from_file(...)
- Support for inputs like:
Changed
-
Polars & plotting
plotting.py::generate_3D_polar_datanow passes a gamma distribution
into the solver:
results = solver.solve(body_aero, gamma_distrbution=gamma)- Legends for distributions and polars are displayed below plots.
- Improved clarity and formatting of plot outputs.
-
Solver internals
- Revised
__init__, added artificial viscosity, refactored internal state toself.*for broader accessibility. - Revised gamma initialization and feedback handling.
- Adjusted Simonet model plumbing and naming (
elliptic→elliptical).
- Revised
-
BodyAerodynamics
calculate_panel_properties: replaced hardcoded0.25 / 0.75withac(aerodynamic center) andcp(center of pressure).
-
Docs & tutorials
- Updated docstrings, tutorials, and user guides to reflect the new APIs and behaviors.
- Expanded convergence & sensitivity study guidance (e.g.,
n_panels).
-
Vector conventions
- Normalized aerodynamic vector handling for consistency across modules.
-
Polar engineering
- Updated to use Surfplan profiles; adjusted
POLARbehavior and tests.
- Updated to use Surfplan profiles; adjusted
Fixed
- Polar data input robustness and format handling.
- Reference point handling in moment computations.
- Multiple failing tests in Panel.
- Plot output issues (including prior formatting issues, e.g. #85).
- Numerous docstring and minor consistency fixes.
Removed
min_relaxation_errorandis_new_vector_definitionfields.using_previous gammaoption (gamma initialization is now explicit/controlled).- Consolidated/moved stall models into dedicated modules/branch.
- Extracted polar_engineering work to its own branch.
Migration Notes
-
Imports / classes
- Replace:
with:
from VSM.core import WingAerodynamics
from VSM.core import BodyAerodynamics
- Replace:
-
Datasets & configs
- Update any paths from:
TUDELFT_V3_LEI_KITE → TUDELFT_V3_KITE
- Update any paths from:
-
Polar files & arrays
- Ensure 3D data is in:
alpha, CL, CD, CM - Ensure 2D data is in:
alpha, Cl, Cd, Cm - If you relied on the old format, update your CSV writers/loaders and tests accordingly.
- Ensure 3D data is in:
-
Solver usage
- Specify the desired gamma initialization and loop type explicitly:
solver.gamma_initial_distribution_type = "elliptical" # or "cosine", "zero" solver.gamma_loop_type = "non_linear" # or "base" solver.artificial_viscosity = ... # set as needed results = solver.solve(body_aero, gamma_distrbution="cosine")
- Remove any reliance on
using_previous gamma.
- Specify the desired gamma initialization and loop type explicitly:
-
Panel model
- If you used
_panel_aero_model, you can now set:panel._panel_aero_model = "cl_is_pisinalpha"
- If you used
-
Plotting
- Legends for certain plots are now at the bottom; if you have custom layout logic, adjust figure margins accordingly.
-
Half-wing workflows
- When generating polars or exporting geometry, adjust scripts to provide half-wing inputs if desired.
-
Caching (masure_regression)
- The regression model caches results on disk; verify your
ml_models_dirand cache paths are writable in CI.
- The regression model caches results on disk; verify your
What's Changed (generated)
- Develop by @jellepoland in #70
- Issue#85 by @corentintran in #86
- 105 adding bridle drag by @jellepoland in #112
- Develop by @jellepoland in #116
- 115 changing polar input to have the dimensions n4 instead of 4n by @jellepoland in #118
- Develop by @jellepoland in #121
- Stall models by @jellepoland in #134
- Merge pull request #70 from ocayon/develop by @jellepoland in #135
- Develop by @ocayon in #144
New Contributors
- @corentintran made their first contribution in #86
Full Changelog: v1.0.0...v1.1.0
v1.0.0
- Refactor code to objected oriented. Physics remain the same as the old version. New engineering stall model added.
- Improved performance and added clear documentation and tutorials.
- The code can be packaged and installed using pip
- Pytested, (coverage 66%)
- Adhering to open-source standards.
Full Changelog: v0.1.0...v1.0.0
v0.1.0
This is the functional base of the VSM, used as the aerodynamic model for my master thesis and paper on aerostructural modeling of soft kites. Links below:
Master Thesis "Fast Aeroelastic Model of a Leading-Edge Inflatable Kite"
Paper "Fast Aero-Structural Model of a Leading-Edge Inflatable Kite"