Source code for RCAIDE.Library.Methods.Performance.propeller_aerodynamic_analysis

#-------------------------------------------------------------------------------
# Imports
#-------------------------------------------------------------------------------
import RCAIDE
from RCAIDE.Framework.Core                              import Units 
from RCAIDE.Framework.Mission.Common                    import Results  
from RCAIDE.Framework.Mission.Segments.Segment          import Segment
 
import numpy as np

# ------------------------------------------------------------------------------
#   Propeller Analysis
# ------------------------------------------------------------------------------ 
[docs] def propeller_aerodynamic_analysis(propeller, velocity_range, angular_velocity = 2500*Units.rpm, angle_of_attack = 0, altitude = 0, delta_isa =0 ): # design aircract electric_rotor = RCAIDE.Library.Components.Powertrain.Propulsors.Electric_Rotor() electric_rotor.rotor = propeller # operarting states ctrl_pts = len(velocity_range) # Find the operating conditions atmosphere = RCAIDE.Framework.Analyses.Atmospheric.US_Standard_1976() atmosphere_conditions = atmosphere.compute_values(propeller.cruise.design_altitude) segment = Segment() conditions = Results() conditions.aerodynamics.angle_of_attack = np.array([[angle_of_attack]]) conditions.freestream.density = atmosphere_conditions.density conditions.freestream.dynamic_viscosity = atmosphere_conditions.dynamic_viscosity conditions.freestream.speed_of_sound = atmosphere_conditions.speed_of_sound conditions.freestream.temperature = atmosphere_conditions.temperature conditions.frames.planet.true_course = np.zeros((ctrl_pts,3,3)) conditions.frames.planet.true_course[:,0,0] = np.cos(0.0), conditions.frames.planet.true_course[:,0,1] = - np.sin(0.0) conditions.frames.planet.true_course[:,1,0] = np.sin(0.0) conditions.frames.planet.true_course[:,1,1] = np.cos(0.0) conditions.frames.planet.true_course[:,2,2] = 1 conditions.frames.wind.transform_to_inertial = np.zeros((ctrl_pts,3,3)) conditions.frames.wind.transform_to_inertial[:,0,0] = np.cos(0.0) conditions.frames.wind.transform_to_inertial[:,0,2] = np.sin(0.0) conditions.frames.wind.transform_to_inertial[:,1,1] = 1 conditions.frames.wind.transform_to_inertial[:,2,0] = -np.sin(0.0) conditions.frames.wind.transform_to_inertial[:,2,2] = np.cos(0.0) conditions.frames.body.transform_to_inertial = np.zeros((ctrl_pts,3,3)) conditions.frames.body.transform_to_inertial[:,0,0] = np.cos(angle_of_attack) conditions.frames.body.transform_to_inertial[:,0,2] = np.sin(angle_of_attack) conditions.frames.body.transform_to_inertial[:,1,1] = 1 conditions.frames.body.transform_to_inertial[:,2,0] = -np.sin(angle_of_attack) conditions.frames.body.transform_to_inertial[:,2,2] = np.cos(angle_of_attack) segment.state.conditions = conditions electric_rotor.append_operating_conditions(segment) for tag, item in electric_rotor.items(): if issubclass(type(item), RCAIDE.Library.Components.Component): item.append_operating_conditions(segment,electric_rotor) # Run BEMT segment.state.conditions.expand_rows(ctrl_pts) conditions.frames.inertial.velocity_vector = velocity_range conditions.freestream.mach_number = conditions.frames.inertial.velocity_vector / conditions.freestream.speed_of_sound rotor_conditions = segment.state.conditions.energy[electric_rotor.tag][propeller.tag] rotor_conditions.omega = angular_velocity RCAIDE.Library.Methods.Powertrain.Converters.Rotor.compute_rotor_performance(electric_rotor,segment.state) results = segment.state.conditions.energy[electric_rotor.tag][propeller.tag] return results