LuchsingerPowerModel¶
The LuchsingerPowerModel wraps the
power-luchsinger
package. The underlying model is an energy-balance model for pumping-cycle
AWE systems originally proposed by Luchsinger (2013). It analytically
evaluates the cycle power for a given wind shear profile by splitting the
pumping cycle into a reel-out (traction) and a reel-in (retraction) phase.
The wrapper maps three awesIO configuration files to the underlying
PowerModel constructor and exposes the AWESPA standard interface.
Wrapper¶
- class awespa.power.luchsinger_power.LuchsingerPowerModel[source]¶
Bases:
PowerEstimationModelWrapper for the Luchsinger pumping kite power model.
This wrapper adapts the vendored Luchsinger power model to the AWESPA modular architecture. The model requires three configuration files in awesIO format:
System configuration (kite, tether, ground station properties)
Wind resource (profiles, probability matrix)
Simulation settings (operational envelope, atmosphere parameters)
- load_configuration(system_path: Path, simulation_settings_path: Path, operational_constraints_path: Path | None = None, wind_resource_path: Path | None = None, validate: bool = True) None[source]¶
Load power model configuration from YAML files.
Creates a
PowerModelinstance from the vendored Luchsinger package using the provided configuration files.- Parameters:
system_path (Path) – Path to the system configuration YAML file (awesIO format with wing, tether, ground_station components).
simulation_settings_path (Path) – Path to simulation settings YAML file containing operational envelope and atmosphere parameters.
operational_constraints_path (Path) – Not used by this model. Defaults to None.
wind_resource_path (Path) – Path to wind resource YAML file containing profiles and probability matrix.
validate (bool) – If True, validate configuration files using the awesIO validator. Defaults to True.
- Raises:
ImportError – If the vendored PowerModel cannot be imported.
FileNotFoundError – If any required file does not exist.
- compute_power_curves(wind_speeds: ndarray | None = None, selected_profiles: list | None = None, output_path: Path | None = None, verbose: bool = True, showplot: bool = False, saveplot: bool = False, validate: bool = True) Dict[str, Any][source]¶
Compute power curves for all wind shear profiles and optionally export.
- Parameters:
output_path (Path) – Path where power curve YAML will be written. If None, no export is performed. Defaults to None.
wind_speeds (np.ndarray) – Custom wind speeds to evaluate [m/s]. If None, uses a linearly-spaced array between cut-in and cut-out from simulation settings. Defaults to None.
verbose (bool) – Whether to print a summary after generation. Defaults to True.
showplot (bool) – Whether to display plots after generation. Defaults to False.
saveplot (bool) – Whether to save plots to file alongside the YAML output. Requires
output_path. Defaults to False.validate (bool) – If True, validate the output YAML file using the awesIO validator. Defaults to True.
- Returns:
- Power curve data with keys
'reference_height_m', 'operational_altitude_m','altitudes', and'profiles'.
- Power curve data with keys
- Return type:
- Raises:
ValueError – If model is not initialized.
- calculate_power_at_wind_speed(wind_speed: float, selected_profile: int = 1, output_path: Path | None = None, verbose: bool = True, showplot: bool = False, saveplot: bool = False, validate: bool = True) float[source]¶
Calculate power output at a single wind speed.
Uses the selected wind profile to derive the wind shear and calls the Luchsinger model for a single operating point.
- Parameters:
wind_speed (float) – Wind speed at reference height [m/s].
selected_profile (int) – Profile index (1-indexed). Defaults to 1.
output_path (Path) – Not used; the vendor model does not support single-point export. Defaults to None.
verbose (bool) – Whether to print the result. Defaults to True.
showplot (bool) – Not used. Defaults to False.
saveplot (bool) – Not used. Defaults to False.
validate (bool) – Not used for single-point evaluation. Defaults to True.
- Returns:
Average cycle power output [W].
- Return type:
- Raises:
ValueError – If model is not initialized.
- plot_power_curves(power_curve_path: Path, output_dir: Path | None = None) None[source]¶
Plot power curves using the vendor’s plotting functions.
Loads the exported YAML and calls the vendor’s
plot_comprehensive_analysisvisualisation.- Parameters:
power_curve_path (Path) – Path to the exported power curves YAML.
output_dir (Path) – Directory where plot files will be saved. If None, plots are saved alongside
power_curve_path. Defaults to None.
- Raises:
FileNotFoundError – If the power curves file does not exist.
ImportError – If vendor plotting functions cannot be imported.
Configuration files¶
load_configuration expects three YAML files:
system_pathSystem configuration in awesIO format (wing area, nominal tether force, nominal generator power, cut-in / cut-out wind speeds, etc.).
simulation_settings_pathSimulation settings controlling the operational envelope, aerodynamic coefficients, and atmosphere parameters.
wind_resource_pathOutput of the wind module — altitude profiles, cluster shapes, and the wind speed probability matrix.
Simulation settings¶
An annotated example is shown below
(see config/example/luchsinger_settings.yml):
settings:
model: luchsinger_original # luchsinger_original | luchsinger_extended_const_lod_in
cut_in_wind_speed_m_s: 4.0 # Cut-in wind speed [m/s]
cut_out_wind_speed_m_s: 25.0 # Cut-out wind speed [m/s]
elevation_angle_out_deg: 30.0 # Tether elevation during reel-out [deg]
elevation_angle_in_deg: 45.0 # Reel-in angle [deg] (luchsinger_original only)
num_points: 250 # Wind speed points for power curve
minimum_tether_length_m: 100.0 # Minimum tether length [m]
air_density_kg_m3: 1.225 # Air density [kg/m³]
lift_coefficient_reel_out: 0.63
drag_coefficient_reel_out: 0.14
tether_drag_coefficient: 1.1
lift_coefficient_reel_in: 0.4 # luchsinger_original only
drag_coefficient_reel_in: 0.12
Usage example¶
from pathlib import Path
from awespa.power.luchsinger_power import LuchsingerPowerModel
model = LuchsingerPowerModel()
model.load_configuration(
system_path=Path("config/example/kitepower V3_25.yml"),
simulation_settings_path=Path("config/example/luchsinger_settings.yml"),
wind_resource_path=Path("results/example/wind_resource.yml"),
)
# Compute all power curves and save to YAML
model.compute_power_curves(
output_path=Path("results/example/power_curves.yml"),
verbose=True,
showplot=False,
saveplot=True,
)
# Single operating point
power_w = model.calculate_power_at_wind_speed(
wind_speed=10.0,
selected_profile=1,
verbose=True,
)
print(f"Power at 10 m/s: {power_w / 1000:.1f} kW")
Or use the ready-made script:
python scripts/run_luchsinger.py