Source code for RCAIDE.Library.Methods.Powertrain.Converters.Rotor.design_lift_rotor
# RCAIDE/Methods/Energy/Propulsors/design_lift_rotor.py
#
#
# Created: Jul 2023, M. Clarke
# ----------------------------------------------------------------------------------------------------------------------
# IMPORT
# ----------------------------------------------------------------------------------------------------------------------
# RCAIDE Imports
from RCAIDE.Framework.Optimization.Packages.scipy import scipy_setup
from RCAIDE.Library.Methods.Powertrain.Converters.Rotor.Design.optimization_setup import optimization_setup
from RCAIDE.Library.Methods.Powertrain.Converters.Rotor.Design.set_optimized_parameters import set_optimized_parameters
# Python package imports
import time
import os
import sys
# ----------------------------------------------------------------------------------------------------------------------
# Design Lift-rotor
# ----------------------------------------------------------------------------------------------------------------------
[docs]
def design_lift_rotor(rotor, number_of_stations=20, solver_name='SLSQP', iterations=200,
solver_sense_step=1E-6, solver_tolerance=1E-5, print_iterations=False):
"""
Optimizes rotor chord and twist distribution to meet design power or thrust requirements.
Parameters
----------
rotor : RCAIDE.Library.Components.Powertrain.Converters.Rotor
Rotor component with the following attributes:
- tag : str
Identifier for the rotor
- hub_radius : float
Hub radius of the rotor [m]
- tip_radius : float
Tip radius of the rotor [m]
- rotation_rate : float
Rotation rate [rad/s]
- freestream_velocity : float
Freestream velocity [m/s]
- number_of_blades : int
Number of blades on the rotor
- design_lift_coefficient : float
Design lift coefficient
- airfoil_data : dict
Dictionary of airfoil data
- optimization_parameters : Data
Optimization parameters
- slack_constraint : float
Slack constraint value
- ideal_SPL_dbA : float
Ideal sound pressure level [dBA]
- multiobjective_aeroacoustic_weight : float
Weight for multiobjective aeroacoustic optimization
number_of_stations : int, optional
Number of radial stations for blade discretization, default 20
solver_name : str, optional
Name of the optimization solver, default 'SLSQP'
iterations : int, optional
Maximum number of iterations, default 200
solver_sense_step : float, optional
Step size for finite difference gradient calculation, default 1E-6
solver_tolerance : float, optional
Convergence tolerance for the optimizer, default 1E-5
print_iterations : bool, optional
Flag to print optimization iterations, default False
Returns
-------
rotor : RCAIDE.Library.Components.Powertrain.Converters.Rotor
Optimized rotor with updated chord and twist distributions
Notes
-----
This function optimizes the chord and twist distributions of a lift rotor to meet
either design power or thrust requirements. It uses RCAIDE's native optimization
framework with an objective function that balances aerodynamic performance and
acoustic characteristics.
The optimization process follows these steps:
1. Set up the optimization problem using the optimization_setup function
2. Solve the optimization problem using the specified solver
3. Report optimization results
4. Update the rotor with the optimized parameters
The objective function is formulated as an aeroacoustic function that considers
both efficiency and radiated noise, with the balance controlled by the
multiobjective_aeroacoustic_weight parameter.
**Major Assumptions**
* Rotor blade design considers one engine inoperative scenario
* Either design power or thrust must be specified (not both)
* The optimization balances aerodynamic performance and acoustic characteristics
See Also
--------
RCAIDE.Library.Methods.Powertrain.Converters.Rotor.Design.optimization_setup
RCAIDE.Library.Methods.Powertrain.Converters.Rotor.Design.set_optimized_parameters
RCAIDE.Framework.Optimization.Packages.scipy.scipy_setup
"""
# Unpack rotor geometry
rotor_tag = rotor.tag
rotor.tag = 'rotor'
# start optimization
ti = time.time()
optimization_problem = optimization_setup(rotor,number_of_stations,print_iterations)
# Commense suppression of console window output
devnull = open(os.devnull,'w')
sys.stdout = devnull
outputs = scipy_setup.SciPy_Solve(optimization_problem,
solver=solver_name,
iter = iterations ,
sense_step = solver_sense_step,
tolerance = solver_tolerance)
# Terminate suppression of console window output
sys.stdout = sys.__stdout__
if outputs[3] != 0:
print('Lift-rotor Optimization Failed: ', outputs[4] )
else:
print('Lift-rotor Optimization Successful')
tf = time.time()
elapsed_time = round((tf-ti)/60,2)
print('Simulation Time: ' + str(elapsed_time) + ' mins')
# set remaining rotor variables using optimized parameters
rotor = set_optimized_parameters(rotor,optimization_problem)
rotor.tag = rotor_tag
return rotor