Hi all,
I’m happy to announce SymbolicAWEModels.jl (registered, currently v0.11.1).
It’s best thought of as a compiler for flexible mechanical systems. You describe a structure — point masses, spring-damper segments, tethers, winches, pulleys, and wings — in either Julia code or a YAML file, and it compiles that description into an efficient
ODEProblem via ModelingToolkit.jl. The motivating application is Airborne Wind Energy (deformable kites that generate power), but the building blocks are general.
Define Components Assemble Compile Simulate
┌──────────────────┐ ┌──────────────┐ ┌─────────────────┐ ┌────────────┐
│ Point, Segment, │───▶│ System │───▶│ SymbolicAWE │───▶│ init!() │
│ Wing, Winch, ... │ │ Structure │ │ Model │ │ next_step! │
│ Julia or YAML │ │ (references) │ │ (eqs→ODEProblem)│ │ sim!() │
└──────────────────┘ └──────────────┘ └─────────────────┘ └────────────┘
What you get
- Building blocks: static/dynamic/quasi-static point masses, spring-damper segments (with drag), tethers, torque-controlled winches with Coulomb + viscous friction, equal-tension pulleys, and both particle-system and rigid-body wings.
- Aerodynamics: wings couple to the Vortex Step Method — either linearised with rigid body dynamics (cheap) or full per-step nonlinear solve with particle system dynamics.
- Symbolic → fast: Because of MTK codegen and structural simplify the generated RHS function is very efficient. The compiled ODEProblem is cached to disk so subsequent runs start in seconds.
- Built-in visualisation: a Makie extension —
using GLMakiefor 2D/3D plots and interactive replay. - Easy initialisation: built-in Transform system to easily orient your system and re-orient between runs.
Minimal example — a tether with a winch
using SymbolicAWEModels
using SymbolicAWEModels: Point
using KiteUtils: init!, next_step!
using GLMakie
SymbolicAWEModels.copy_data() # writes bundled data/ into your project dir
set_data_path("data/base") # point KiteUtils at it
set = Settings("system.yaml")
set.l_tether = 50.0
set.d_tether = 4.0 # 4 mm
points = [
Point(:ground, [0, 0, 0], STATIC; transform=:tf),
Point(:tip, [0, 0, set.l_tether], DYNAMIC; extra_mass=1.0, transform=:tf),
]
# Route 2: tether auto-generates its intermediate points + segments
tethers = [Tether(:main; start_point=:ground, end_point=:tip, n_segments=20)]
winches = [Winch(:winch, set, [:main]; winch_point=:ground)]
transforms = [Transform(:tf, deg2rad(-80), 0, 0;
base_pos=[0, 0, set.l_tether],
base_point=:ground, rot_point=:tip)]
sys = SystemStructure("tether", set; points, tethers, winches, transforms)
plot(sys)
sam = SymbolicAWEModel(set, sys)
init!(sam; remake=false)
for _ in 1:500
next_step!(sam; set_values=[15.0]) # positive torque reels the tether out (lengthens) [Nm]
plot!(sam.sys_struct)
sleep(0.05)
end
The same model can be expressed in YAML. Components support symbolic indexing (sys.points[:kcu], sys.segments[:bridle_1]), and because the symbolic getters read from live structs, you can mutate parameters between runs without recompiling.
Correctness
Each component is tested in isolation against analytical solutions — terminal velocity, angular-momentum conservation, spring-damper constitutive laws, Coulomb/viscous friction, etc. — so the underlying dynamics are verified physically, not just numerically.
Ready-made kite models
SymbolicAWEModels provides the building blocks; complete kite models live in dedicated packages:
- V3Kite.jl — TU Delft V3 leading-edge-inflatable kite. Validated against real flight data.
- RamAirKite.jl — ram-air kite with bridle system and deformable wing groups
It’s part of the Open Source AWE organisation, which contains many useful packages for Airborne Wind Energy simulation and control.
Links
- Docs: Home · SymbolicAWEModels.jl
- Repo: GitHub - OpenSourceAWE/SymbolicAWEModels.jl: Symbolic wing, tether and winch models for the simulation of Airborne Wind Energy systems. · GitHub
- License: LGPL-3.0 · DOI: 10.5281/zenodo.19092013
Feedback, issues, and contributions very welcome!
— Bart van de Lint (with @ufechner7 and Jelle Poland)
