A modular Python toolchain for assessing Airborne Wind Energy (AWE) system performance using wind profile clustering, physics-based power estimation models, and Annual Energy Production (AEP) calculation.
AWESPA provides a complete, three-step pipeline for AWE system performance analysis:
- Wind module – Process ERA5 (or other) wind data to extract representative wind profiles via clustering.
- Power module – Compute power curves for each wind profile cluster using a physics-based power model.
- Pipeline module – Which combines the other modules for example to calculate AEP.
All tools are installed as a Python package and can be used as a library or through the provided runnable scripts. Each module is built around an Abstract Base Class (ABC) so that different implementations (e.g. different power models) share the same interface. Swapping in a new model only requires changing the class you instantiate — the rest of the pipeline stays the same.
All configuration is stored in YAML files, making analyses easy to reproduce and share. The inter-module data format follows the awesIO standard, so the output of one step is directly readable by the next.
While there are existing tools for AWE performance assessment, they often lack modularity, are not open-source, or require significant effort to set up and run. AWESPA aims to fill this gap by providing a user-friendly, flexible, and extensible toolchain that can be easily adopted by researchers and practitioners in the AWE community.
AWESPA/
├── config/ # YAML configuration files
│ └── example/ # Ready-to-run example configurations
├── data/ # Input wind data (ERA5 NetCDF files)
├── results/ # AEP results, power curves, and plots
├── scripts/ # Runnable analysis scripts
│ ├── run_wind_clustering.py
│ ├── run_luchsinger.py
│ └── run_inertiafree_qsm.py
├── src/awespa/ # Package source code
│ ├── wind/ # Wind module (base class + ERA5 clustering wrapper)
│ ├── power/ # Power module (base class + model wrappers)
│ └── pipeline/ # AEP pipeline
├── tests/ # Test suite
└── docs/ # Sphinx documentation
- Python 3.8 or higher
- pip
- Git (required to fetch the GitHub-hosted dependencies)
If you want to use AWESPA in your own project without cloning this repository, install it directly from GitHub:
pip install git+https://github.com/awegroup/AWESPA.gitAfter installation you can import AWESPA in any Python environment:
from awespa.wind.clustering import WindProfileClusteringModel
from awespa.power.luchsinger_power import LuchsingerPowerModel
from awespa.pipeline.aep import calculate_aepYou will still need to provide your own configuration YAML files and wind data.
The example configuration files in config/example/ of this repository can serve as a starting point.
-
Clone the repository:
git clone https://github.com/awegroup/AWESPA.git cd AWESPA -
Create and activate a virtual environment:
Linux / macOS:
python3 -m venv venv source venv/bin/activateWindows (PowerShell):
python -m venv venv .\venv\Scripts\Activate
-
Install the package:
For users (run the example scripts):
pip install .For developers (editable install with dev tools):
pip install -e .[dev]
-
To deactivate the virtual environment when you are done:
deactivate
Note: All physics-based dependencies (
inertiafree-qsm,power-luchsinger,wind-profile-clustering) are fetched automatically from GitHub duringpip install. Git must be available on yourPATH.
# Module-level imports
from awespa.wind.clustering import WindProfileClusteringModel
from awespa.power.luchsinger_power import LuchsingerPowerModel
from awespa.power.inertiafree_qsm_power import InertiaFreeQSMPowerModel
from awespa.pipeline.aep import calculate_aepEach script uses the configuration files in config/example/ and writes output to results/example/.
Step 1 – Wind profile clustering:
python scripts/run_wind_clustering.pyStep 2 – Power curve generation (Luchsinger model):
python scripts/run_luchsinger.pyOR (Inertia-Free QSM):
python scripts/run_inertiafree_qsm.pyfrom pathlib import Path
from awespa.wind.clustering import WindProfileClusteringModel
from awespa.power.luchsinger_power import LuchsingerPowerModel
from awespa.pipeline.aep import calculate_aep
CONFIG = Path("config/example")
RESULTS = Path("results/example")
RESULTS.mkdir(parents=True, exist_ok=True)
# --- Step 1: Wind profile clustering ---
wind_model = WindProfileClusteringModel()
wind_model.load_configuration(CONFIG / "wind_clustering_settings.yml")
wind_model.cluster(
dataPath=Path("data/wind_data/era5"),
outputPath=RESULTS / "wind_resource.yml",
verbose=True,
showplot=False,
saveplot=True,
)
# --- Step 2: Power curve generation ---
power_model = LuchsingerPowerModel()
power_model.load_configuration(
system_path=CONFIG / "tudelft V3_25.yml",
simulation_settings_path=CONFIG / "luchsinger_settings.yml",
wind_resource_path=RESULTS / "wind_resource.yml",
)
power_model.compute_power_curves(
output_path=RESULTS / "power_curves.yml",
verbose=True,
showplot=False,
saveplot=True,
)
# --- Step 3: AEP calculation ---
aep_results = calculate_aep(
power_curve_path=RESULTS / "power_curves.yml",
wind_resource_path=RESULTS / "wind_resource.yml",
output_path=RESULTS / "aep_results.yml",
plot=True,
plot_output_dir=RESULTS / "plots",
)
print(aep_results['annual_energy_production']["total"])Each step is controlled by one or more YAML files. Example files are provided in config/example/:
| File | Used by | Purpose |
|---|---|---|
wind_clustering_settings.yml |
Wind module | Clustering parameters, data source, location |
tudelft V3_25.yml |
Power module | System parameters (wing, tether, ground station) in awesIO format |
luchsinger_settings.yml |
Power module | Luchsinger simulation settings |
inertiafree-qsm_settings.yml |
Power module | Inertia-Free QSM simulation settings |
wind_resource.yml |
Power module, Pipeline | Output of the wind module; wind profiles and probability matrix |
power_curves.yml |
Pipeline | Output of the power module; power curves for each profile |
Pull requests are welcome. For major changes, please open an issue first to discuss what you would like to change. Please make sure to update tests as appropriate.
See README_dev.md for detailed development guidelines.
MIT License — Copyright (c) 2026 Airborne Wind Energy Research Group, TU Delft
Technische Universiteit Delft hereby disclaims all copyright interest in the program "AWESPA" (Airborne Wind Energy System Performance Assessment Toolchain) written by the Author(s).
Prof.dr. H.G.C. (Henri) Werij, Dean of Aerospace Engineering
- AWESPA Documentation - Getting started guide and API reference
- AWE Group | Developer Guide
- AWESPA GitHub Repository