AWESPA¶
Airborne Wind Energy System Performance Assessment Toolchain
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.
Getting Started¶
Overview¶
AWESPA provides a complete, three-step pipeline:
Wind module — Process wind data to extract representative wind profiles via clustering. See Wind Module.
Power module — Compute power curves for each wind profile cluster using a physics-based model. See Power Module.
Pipeline — Scripts which are not referring to an external library, this is a helper module that already contains for example the AEP calculation.
All inter-module data is exchanged through the awesIO-format YAML files as much as possible, so the output of one step is directly readable by the next. Each module follows an Abstract Base Class interface, making it straightforward to swap in other models of the same module. The setting files for each module are also YAML-based, ensuring that the entire analysis is reproducible from a single configuration file. But these configuration files are not in awesIO format.
Project Structure¶
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
│ ├── power/ # Power module
│ └── pipeline/ # Pipline scripts and utilities
├── tests/ # Test suite
└── docs/ # This documentation
Installation¶
Prerequisites¶
Python 3.8 or higher
pip
Git (required for pip to fetch the GitHub-hosted dependencies)
Installation Instructions¶
Clone the repository:
git clone https://github.com/awegroup/AWESPA.git cd AWESPA
Create a virtual environment:
Linux / macOS:
python3 -m venv venv source venv/bin/activate
Windows (PowerShell):
python -m venv venv .\venv\Scripts\Activate
Install the package:
For users:
pip install .
For developers (editable install with dev tools):
pip install -e .[dev]
To deactivate the virtual environment:
deactivate
Note
The three dependencies (inertiafree-qsm,
power-luchsinger, wind-profile-clustering) are fetched
automatically from GitHub during pip install. Git must be available
on your PATH.
Usage¶
Running the example scripts¶
Each script uses the configuration files in config/example/ and writes
output to results/example/.
Step 1 — Wind profile clustering:
python scripts/run_wind_clustering.py
Step 2 — Power curve generation (Luchsinger model):
python scripts/run_luchsinger.py
Step 2 (alternative) — Power curve generation (Inertia-Free QSM):
python scripts/run_inertiafree_qsm.py
Complete pipeline example¶
from 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(f"AEP: {aep_results['annual_energy_production']['total']['aep_mwh']:.1f} MWh/year")
Contributing¶
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 the Developer Guide for detailed development guidelines.
Resources¶
License¶
MIT License — Copyright (c) 2024 Airborne Wind Energy Research Group, TU Delft