Source code for RCAIDE.Library.Methods.Powertrain.Propulsors.Turboprop.design_turboprop

# RCAIDE/Library/Methods/Energy/Powertrain/Propulsors/Turboprop/design_turboprop.py
# 
# 
# Created:  Jul 2023, M. Clarke 

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

# RCAIDE Imports     
import RCAIDE
from RCAIDE.Framework.Core                                                    import Data 
from RCAIDE.Library.Methods.Powertrain.Converters.Ram                         import compute_ram_performance
from RCAIDE.Library.Methods.Powertrain.Converters.Combustor                   import compute_combustor_performance
from RCAIDE.Library.Methods.Powertrain.Converters.Compressor                  import compute_compressor_performance
from RCAIDE.Library.Methods.Powertrain.Converters.Turbine                     import compute_turbine_performance
from RCAIDE.Library.Methods.Powertrain.Converters.Expansion_Nozzle            import compute_expansion_nozzle_performance 
from RCAIDE.Library.Methods.Powertrain.Converters.Compression_Nozzle          import compute_compression_nozzle_performance
from RCAIDE.Library.Methods.Powertrain.Propulsors.Turboprop                   import size_core 
from RCAIDE.Library.Methods.Powertrain                                        import setup_operating_conditions 
from RCAIDE.Library.Methods.Powertrain.Converters.Motor                       import design_optimal_motor 
from RCAIDE.Library.Methods.Mass_Properties.Weight_Buildups.Electric.Common   import compute_motor_weight

# Python package imports   
import numpy                                                                as np

# ----------------------------------------------------------------------------------------------------------------------  
#  Design Turboshaft
# ----------------------------------------------------------------------------------------------------------------------   
[docs] def design_turboprop(turboprop): """ Sizes a turboprop engine based on design point conditions and computes its performance characteristics. Parameters ---------- turboprop : Turboprop Turboprop engine object containing all component definitions and design parameters - design_mach_number : float Design point Mach number - design_altitude : float Design point altitude [m] - design_isa_deviation : float ISA temperature deviation [K] - working_fluid : FluidProperties Working fluid properties object - Components: - ram : Ram - inlet_nozzle : Compression_Nozzle - compressor : Compressor - combustor : Combustor - high_pressure_turbine : Turbine - low_pressure_turbine : Turbine - core_nozzle : Expansion_Nozzle Returns ------- None Results are stored in the turboprop object attributes: - design_thrust_specific_fuel_consumption : float TSFC at design point [kg/N/s] - design_non_dimensional_thrust : float Non-dimensional thrust at design point [-] - design_core_mass_flow_rate : float Core mass flow rate at design point [kg/s] - design_fuel_flow_rate : float Fuel flow rate at design point [kg/s] - design_power : float Power output at design point [W] - design_specific_power : float Specific power at design point [W/kg] - design_power_specific_fuel_consumption : float Power specific fuel consumption [kg/W/s] - design_thermal_efficiency : float Thermal efficiency at design point [-] - design_propulsive_efficiency : float Propulsive efficiency at design point [-] Notes ----- The function performs the following steps: 1. Computes atmospheric conditions at design altitude 2. Sets up freestream conditions 3. Analyzes flow through each component sequentially 4. Sizes the core based on design point requirements 5. Computes sea level static performance **Major Assumptions** * Standard atmospheric conditions (with possible ISA deviation) * Steady state operation * Perfect gas behavior * Adiabatic component processes except combustor * No bleed air extraction **Theory** The design process follows standard gas turbine cycle analysis, with each component modeled using appropriate thermodynamic relations. The core sizing is based on achieving the required power output while maintaining component matching throughout the engine. See Also -------- RCAIDE.Library.Methods.Powertrain.Converters.Ram.compute_ram_performance RCAIDE.Library.Methods.Powertrain.Converters.Combustor.compute_combustor_performance RCAIDE.Library.Methods.Powertrain.Converters.Compressor.compute_compressor_performance RCAIDE.Library.Methods.Powertrain.Converters.Turbine.compute_turbine_performance """ #check if mach number and temperature are passed if turboprop.design_altitude==None: if turboprop.design_mach_number==None and turboprop.design_freestream_velocity ==None: raise NameError('The sizing conditions require an altitude and a Mach number or Velocity ') else: #call the atmospheric model to get the conditions at the specified altitude atmosphere = RCAIDE.Framework.Analyses.Atmospheric.US_Standard_1976() atmo_data = atmosphere.compute_values(turboprop.design_altitude,turboprop.design_isa_deviation) planet = RCAIDE.Library.Attributes.Planets.Earth() p = atmo_data.pressure T = atmo_data.temperature rho = atmo_data.density a = atmo_data.speed_of_sound mu = atmo_data.dynamic_viscosity if turboprop.design_mach_number==None: turboprop.design_mach_number = turboprop.design_freestream_velocity / a # setup conditions conditions = RCAIDE.Framework.Mission.Common.Results() # freestream conditions conditions.freestream.altitude = np.atleast_1d(turboprop.design_altitude) conditions.freestream.mach_number = np.atleast_1d(turboprop.design_mach_number) conditions.freestream.pressure = np.atleast_1d(p) conditions.freestream.temperature = np.atleast_1d(T) conditions.freestream.density = np.atleast_1d(rho) conditions.freestream.dynamic_viscosity = np.atleast_1d(mu) conditions.freestream.gravity = np.atleast_1d(planet.compute_gravity(turboprop.design_altitude)) conditions.freestream.isentropic_expansion_factor = np.atleast_1d(turboprop.working_fluid.compute_gamma(T,p)) conditions.freestream.Cp = np.atleast_1d(turboprop.working_fluid.compute_cp(T,p)) conditions.freestream.R = np.atleast_1d(turboprop.working_fluid.gas_specific_constant) conditions.freestream.speed_of_sound = np.atleast_1d(a) conditions.freestream.velocity = np.atleast_1d(a*turboprop.design_mach_number) segment = RCAIDE.Framework.Mission.Segments.Segment() segment.state.conditions = conditions turboprop.append_operating_conditions(segment,conditions.energy,conditions.noise) ram = turboprop.ram inlet_nozzle = turboprop.inlet_nozzle compressor = turboprop.compressor combustor = turboprop.combustor high_pressure_turbine = turboprop.high_pressure_turbine low_pressure_turbine = turboprop.low_pressure_turbine core_nozzle = turboprop.core_nozzle # unpack component conditions turboprop_conditions = conditions.energy.propulsors[turboprop.tag] ram_conditions = conditions.energy.converters[ram.tag] inlet_nozzle_conditions = conditions.energy.converters[inlet_nozzle.tag] core_nozzle_conditions = conditions.energy.converters[core_nozzle.tag] compressor_conditions = conditions.energy.converters[compressor.tag] combustor_conditions = conditions.energy.converters[combustor.tag] lpt_conditions = conditions.energy.converters[low_pressure_turbine.tag] hpt_conditions = conditions.energy.converters[high_pressure_turbine.tag] # Step 1: Set the working fluid to determine the fluid properties ram.working_fluid = turboprop.working_fluid # Step 2: Compute flow through the ram , this computes the necessary flow quantities and stores it into conditions compute_ram_performance(ram,conditions) # Step 3: link inlet nozzle to ram inlet_nozzle_conditions.inputs.stagnation_temperature = ram_conditions.outputs.stagnation_temperature inlet_nozzle_conditions.inputs.stagnation_pressure = ram_conditions.outputs.stagnation_pressure inlet_nozzle_conditions.inputs.static_temperature = ram_conditions.outputs.static_temperature inlet_nozzle_conditions.inputs.static_pressure = ram_conditions.outputs.static_pressure inlet_nozzle_conditions.inputs.mach_number = ram_conditions.outputs.mach_number inlet_nozzle.working_fluid = ram.working_fluid # Step 4: Compute flow through the inlet nozzle compute_compression_nozzle_performance(inlet_nozzle,conditions) # Step 5: Link low pressure compressor to the inlet nozzle compressor_conditions.inputs.stagnation_temperature = inlet_nozzle_conditions.outputs.stagnation_temperature compressor_conditions.inputs.stagnation_pressure = inlet_nozzle_conditions.outputs.stagnation_pressure compressor_conditions.inputs.static_temperature = inlet_nozzle_conditions.outputs.static_temperature compressor_conditions.inputs.static_pressure = inlet_nozzle_conditions.outputs.static_pressure compressor_conditions.inputs.mach_number = inlet_nozzle_conditions.outputs.mach_number compressor.working_fluid = inlet_nozzle.working_fluid compressor.nondimensional_massflow = turboprop.compressor_nondimensional_massflow compressor.reference_temperature = turboprop.reference_temperature compressor.reference_pressure = turboprop.reference_pressure # Step 6: Compute flow through the low pressure compressor compute_compressor_performance(compressor,conditions) # Step 7: Link the combustor to the high pressure compressor combustor_conditions.inputs.stagnation_temperature = compressor_conditions.outputs.stagnation_temperature combustor_conditions.inputs.stagnation_pressure = compressor_conditions.outputs.stagnation_pressure combustor_conditions.inputs.static_temperature = compressor_conditions.outputs.static_temperature combustor_conditions.inputs.static_pressure = compressor_conditions.outputs.static_pressure combustor_conditions.inputs.mach_number = compressor_conditions.outputs.mach_number combustor.working_fluid = compressor.working_fluid # Step 8: Compute flow through the high pressor compressor compute_combustor_performance(combustor,conditions) #link the high pressure turbione to the combustor hpt_conditions.inputs.stagnation_temperature = combustor_conditions.outputs.stagnation_temperature hpt_conditions.inputs.stagnation_pressure = combustor_conditions.outputs.stagnation_pressure hpt_conditions.inputs.fuel_to_air_ratio = combustor_conditions.outputs.fuel_to_air_ratio hpt_conditions.inputs.static_temperature = combustor_conditions.outputs.static_temperature hpt_conditions.inputs.static_pressure = combustor_conditions.outputs.static_pressure hpt_conditions.inputs.mach_number = combustor_conditions.outputs.mach_number hpt_conditions.inputs.compressor = compressor_conditions.outputs high_pressure_turbine.working_fluid = combustor.working_fluid hpt_conditions.inputs.bypass_ratio = 0.0 compute_turbine_performance(high_pressure_turbine,conditions) #link the low pressure turbine to the high pressure turbine lpt_conditions.inputs.stagnation_temperature = hpt_conditions.outputs.stagnation_temperature lpt_conditions.inputs.stagnation_pressure = hpt_conditions.outputs.stagnation_pressure lpt_conditions.inputs.static_temperature = hpt_conditions.outputs.static_temperature lpt_conditions.inputs.static_pressure = hpt_conditions.outputs.static_pressure lpt_conditions.inputs.mach_number = hpt_conditions.outputs.mach_number lpt_conditions.inputs.compressor = Data() lpt_conditions.inputs.compressor.work_done = 0.0 lpt_conditions.inputs.compressor.external_shaft_work_done = 0.0 lpt_conditions.inputs.bypass_ratio = 0.0 lpt_conditions.inputs.fuel_to_air_ratio = combustor_conditions.outputs.fuel_to_air_ratio low_pressure_turbine.working_fluid = high_pressure_turbine.working_fluid compute_turbine_performance(low_pressure_turbine,conditions) #link the core nozzle to the low pressure turbine core_nozzle_conditions.inputs.stagnation_temperature = lpt_conditions.outputs.stagnation_temperature core_nozzle_conditions.inputs.stagnation_pressure = lpt_conditions.outputs.stagnation_pressure core_nozzle_conditions.inputs.static_temperature = lpt_conditions.outputs.static_temperature core_nozzle_conditions.inputs.static_pressure = lpt_conditions.outputs.static_pressure core_nozzle_conditions.inputs.mach_number = lpt_conditions.outputs.mach_number core_nozzle.working_fluid = low_pressure_turbine.working_fluid #flow through the core nozzle compute_expansion_nozzle_performance(core_nozzle,conditions) # compute the thrust using the thrust component turboprop_conditions.total_temperature_reference = compressor_conditions.inputs.stagnation_temperature turboprop_conditions.total_pressure_reference = compressor_conditions.inputs.stagnation_pressure # Step 25: Size the core of the turboprop size_core(turboprop,conditions) # Step 26: Static Sea Level Thrust atmo_data_sea_level = atmosphere.compute_values(0.0,0.0) V = atmo_data_sea_level.speed_of_sound[0][0]*0.01 operating_state = setup_operating_conditions(turboprop, altitude = 0,velocity_range=np.array([V])) operating_state.conditions.energy.propulsors[turboprop.tag].throttle[:,0] = 1.0 sls_T,_,sls_P,_,_,_ = turboprop.compute_performance(operating_state) turboprop.sealevel_static_thrust = sls_T[0][0] turboprop.sealevel_static_power = sls_P[0][0] turboprop.design_thrust_specific_fuel_consumption = turboprop_conditions.thrust_specific_fuel_consumption turboprop.design_non_dimensional_thrust = turboprop_conditions.non_dimensional_thrust turboprop.design_core_mass_flow_rate = turboprop_conditions.core_mass_flow_rate turboprop.design_fuel_flow_rate = turboprop_conditions.fuel_flow_rate turboprop.design_specific_power = turboprop_conditions.specific_power turboprop.design_power_specific_fuel_consumption = turboprop_conditions.power_specific_fuel_consumption turboprop.design_thermal_efficiency = turboprop_conditions.thermal_efficiency turboprop.design_propulsive_efficiency = turboprop_conditions.propulsive_efficiency if compressor.motor != None: V = turboprop.design_freestream_velocity operating_state = setup_operating_conditions(turboprop, altitude = turboprop.design_altitude,velocity_range=np.array([V])) operating_state.conditions.energy.propulsors[turboprop.tag].throttle[:,0] = 1.0 T,_,P,_,_,_ = turboprop.compute_performance(operating_state) motor = compressor.motor motor.design_torque = P[0][0] /compressor.design_angular_velocity motor.design_angular_velocity = compressor.design_angular_velocity motor.mass_properties.mass = compute_motor_weight(motor) design_optimal_motor(motor) return