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: PowerEstimationModel

Wrapper 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)

__init__()[source]

Initialize the Luchsinger power estimation model.

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 PowerModel instance 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:
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'.

Return type:

dict

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:

float

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_analysis visualisation.

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:

Configuration files

load_configuration expects three YAML files:

system_path

System configuration in awesIO format (wing area, nominal tether force, nominal generator power, cut-in / cut-out wind speeds, etc.).

simulation_settings_path

Simulation settings controlling the operational envelope, aerodynamic coefficients, and atmosphere parameters.

wind_resource_path

Output 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