Source code for RCAIDE.Library.Methods.Powertrain.Converters.Rotor.Design.blade_geometry_setup

# RCAIDE/Methods/Energy/Propulsors/Rotor_Design/optimization_setup.py
# 
# 
# Created:  Jul 2023, M. Clarke 


# ----------------------------------------------------------------------------------------------------------------------
#  IMPORT
# ----------------------------------------------------------------------------------------------------------------------  

# RCAIDE Imports 
import RCAIDE   
from RCAIDE.Library.Methods.Geometry.Airfoil  import compute_airfoil_properties, compute_naca_4series, import_airfoil_geometry

# Python package imports   
import numpy as np  
    
# ----------------------------------------------------------------------------------------------------------------------  
#  Blade Geometry Setup 
# ----------------------------------------------------------------------------------------------------------------------    
[docs] def blade_geometry_setup(rotor, number_of_stations): """ Defines a configuration for prop-rotor blade optimization. Parameters ---------- rotor : RCAIDE.Library.Components.Powertrain.Converters.Rotor Rotor component with the following attributes: - number_of_blades : int Number of blades on the rotor - tip_radius : float Tip radius of the rotor [m] - hub_radius : float Hub radius of the rotor [m] - hover : Data Hover conditions - design_thrust : float, optional Design thrust at hover [N] - design_power : float, optional Design power at hover [W] - design_freestream_velocity : float Freestream velocity at hover [m/s] - design_altitude : float Altitude at hover [m] - oei : Data One engine inoperative conditions - design_freestream_velocity : float, optional Freestream velocity at OEI [m/s] - design_altitude : float, optional Altitude at OEI [m] - design_thrust : float, optional Design thrust at OEI [N] - design_power : float, optional Design power at OEI [W] - airfoils : dict Dictionary of airfoil objects - airfoil_polar_stations : list List of airfoil section indices for each station number_of_stations : int Number of radial stations for blade discretization Returns ------- configs : RCAIDE.Library.Components.Configs.Config.Container Configuration container with the following configs: - hover : Config Hover configuration - oei : Config One engine inoperative configuration - cruise : Config (only for prop-rotors) Cruise configuration Notes ----- This function prepares the necessary configurations for rotor blade optimization by: 1. Unpacking rotor geometry parameters 2. Validating design requirements (thrust or power must be specified) 3. Processing airfoil data (importing geometry and computing polars if needed) 4. Setting up the radial distribution of stations 5. Extracting thickness-to-chord ratios from airfoils 6. Setting default OEI conditions if not specified 7. Creating vehicle and network configurations for analysis The function creates separate configurations for hover, OEI, and cruise (for prop-rotors) conditions, which are used during the optimization process to evaluate the rotor performance at different operating points. **Major Assumptions** * Either design thrust or design power must be specified (not both) * If OEI conditions are not specified, they default to hover conditions with 10% increase * Rotor orientation is set to [0.0, π/2, 0.0] (horizontal rotor) See Also -------- RCAIDE.Library.Methods.Powertrain.Converters.Rotor.Design.optimization_setup RCAIDE.Library.Methods.Geometry.Airfoil.compute_airfoil_properties RCAIDE.Library.Methods.Geometry.Airfoil.compute_naca_4series RCAIDE.Library.Methods.Geometry.Airfoil.import_airfoil_geometry """ # Unpack prop-rotor geometry N = number_of_stations B = rotor.number_of_blades R = rotor.tip_radius Rh = rotor.hub_radius design_thrust_hover = rotor.hover.design_thrust design_power_hover = rotor.hover.design_power chi0 = Rh/R chi = np.linspace(chi0,1,N+1) chi = chi[0:N] airfoils = rotor.airfoils a_loc = rotor.airfoil_polar_stations # determine target values if (design_thrust_hover == None) and (design_power_hover== None): raise AssertionError('Specify either design thrust or design power at hover!') elif (design_thrust_hover!= None) and (design_power_hover!= None): raise AssertionError('Specify either design thrust or design power at hover!') num_airfoils = len(airfoils.keys()) if num_airfoils>0: if len(a_loc) != N: raise AssertionError('\nDimension of airfoil sections must be equal to number of stations on propeller') for _,airfoil in enumerate(airfoils): if airfoil.geometry == None: # first, if airfoil geometry data not defined, import from geoemtry files if type(airfoil) == RCAIDE.Library.Components.Airfoils.NACA_4_Series_Airfoil: # check if naca 4 series of airfoil from datafile airfoil.geometry = compute_naca_4series(airfoil.NACA_4_Series_code,airfoil.number_of_points) else: airfoil.geometry = import_airfoil_geometry(airfoil.coordinate_file,airfoil.number_of_points) if airfoil.polars == None: # compute airfoil polars for airfoils airfoil.polars = compute_airfoil_properties(airfoil.geometry, airfoil_polar_files= airfoil.polar_files) # thickness to chord t_c = np.zeros(N) if num_airfoils>0: for j,airfoil in enumerate(airfoils): a_geo = airfoil.geometry locs = np.where(np.array(a_loc) == j ) t_c[locs] = a_geo.thickness_to_chord # append additional prop-rotor properties for optimization rotor.number_of_blades = int(B) rotor.thickness_to_chord = t_c rotor.radius_distribution = chi*R # set oei conditions if they are not set if rotor.oei.design_freestream_velocity == None: rotor.oei.design_freestream_velocity = rotor.hover.design_freestream_velocity if rotor.oei.design_altitude == None: rotor.oei.design_altitude = rotor.hover.design_altitude if design_thrust_hover == None: if rotor.oei.design_power == None: rotor.oei.design_power = rotor.hover.design_power*1.1 elif design_power_hover == None: if rotor.oei.design_thrust == None: rotor.oei.design_thrust = rotor.hover.design_thrust*1.1 vehicle = RCAIDE.Vehicle() net = RCAIDE.Framework.Networks.Electric() propulsor = RCAIDE.Library.Components.Powertrain.Propulsors.Electric_Rotor() propulsor.rotor = rotor net.propulsors.append(propulsor) vehicle.append_energy_network(net) configs = RCAIDE.Library.Components.Configs.Config.Container() base_config = RCAIDE.Library.Components.Configs.Config(vehicle) config = RCAIDE.Library.Components.Configs.Config(base_config) config.tag = 'hover' config.networks.electric.propulsors.electric_rotor.rotor.orientation_euler_angles = [0.0,np.pi/2,0.0] configs.append(config) config = RCAIDE.Library.Components.Configs.Config(base_config) config.tag = 'oei' config.networks.electric.propulsors.electric_rotor.rotor.orientation_euler_angles = [0.0,np.pi/2,0.0] configs.append(config) if type(rotor) == RCAIDE.Library.Components.Powertrain.Converters.Prop_Rotor: design_thrust_cruise = rotor.cruise.design_thrust design_power_cruise = rotor.cruise.design_power if (design_thrust_cruise == None) and (design_power_cruise== None): raise AssertionError('Specify either design thrust or design power at cruise!') elif (design_thrust_cruise!= None) and (design_power_cruise!= None): raise AssertionError('Specify either design thrust or design power at cruise!') config = RCAIDE.Library.Components.Configs.Config(base_config) config.tag = 'cruise' config.networks.electric.propulsors.electric_rotor.rotor.orientation_euler_angles = [0.0,np.pi/2,0.0] configs.append(config) return configs