Source code for RCAIDE.Library.Methods.Powertrain.Propulsors.Turbojet.design_turbojet

# RCAIDE/Methods/Energy/Propulsors/Turbojet/design_turbojet.py
# 
# 
# Created:  Jul 2023, M. Clarke 

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

# RCAIDE Imports     
import RCAIDE 
from RCAIDE.Framework.Mission.Common                                 import Conditions
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.Supersonic_Nozzle  import compute_supersonic_nozzle_performance
from RCAIDE.Library.Methods.Powertrain.Converters.Compression_Nozzle import compute_compression_nozzle_performance
from RCAIDE.Library.Methods.Powertrain.Propulsors.Turbojet           import size_core  
from RCAIDE.Library.Methods.Powertrain                               import setup_operating_conditions 

# Python package imports   
import numpy as np

# ----------------------------------------------------------------------------------------------------------------------  
#  Design Turbojet
# ----------------------------------------------------------------------------------------------------------------------   
[docs] def design_turbojet(turbojet): """ Designs a turbojet engine by computing performance properties and sizing components based on design conditions. Parameters ---------- turbojet : Turbojet Turbojet engine object containing design parameters and components - 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 : Gas Working fluid object for gas properties - Components: - ram : Ram - inlet_nozzle : Compression_Nozzle - low_pressure_compressor : Compressor - high_pressure_compressor : Compressor - combustor : Combustor - high_pressure_turbine : Turbine - low_pressure_turbine : Turbine - core_nozzle : Supersonic_Nozzle Returns ------- None Updates turbojet object attributes in-place: - mass_flow_rate_design : float Design core mass flow rate [kg/s] - design_core_massflow : float Core mass flow at design point [kg/s] Notes ----- This function performs the following steps: 1. Computes atmospheric conditions at design point 2. Sets up freestream conditions 3. Links and analyzes flow through each component: - Ram inlet - Inlet nozzle - Low pressure compressor - High pressure compressor - Combustor - High pressure turbine - Low pressure turbine - Core nozzle 4. Sizes the core based on design thrust requirements 5. Computes static sea level performance **Major Assumptions** * Quasi-one-dimensional flow * Each component operates in steady state * Perfect gas behavior in non-combustion sections * US Standard Atmosphere 1976 model * Earth gravity model * Design point defines core sizing **Theory** The design process follows standard gas turbine design principles: .. math:: \\text{Mass flow continuity: } \\dot{m}_{in} = \\dot{m}_{out} \\text{Power Balance: } W_{compressor} = W_{turbine} \\text{Core sizing: } \\dot{m}_{core} = \\frac{F_{design}}{F_{sp} a_0} where: - :math:`F_{design}` is the design thrust - :math:`F_{sp}` is the specific thrust - :math:`a_0` is the freestream speed of sound References ---------- [1] Mattingly, J. D., "Elements of Gas Turbine Propulsion", McGraw-Hill, 1996 [2] Walsh, P. P., Fletcher, P., "Gas Turbine Performance", Blackwell Science, 2004 See Also -------- RCAIDE.Library.Methods.Powertrain.Propulsors.Turbojet.compute_turbojet_performance RCAIDE.Library.Methods.Powertrain.Propulsors.Turbojet.size_core RCAIDE.Library.Methods.Powertrain.Propulsors.Common.compute_static_sea_level_performance """ #check if mach number and temperature are passed if(turbojet.design_mach_number==None or turbojet.design_altitude==None): #raise an error raise NameError('The sizing conditions require an altitude and a Mach number') 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(turbojet.design_altitude,turbojet.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 # setup conditions conditions = RCAIDE.Framework.Mission.Common.Results() # freestream conditions conditions.freestream.altitude = np.atleast_1d(turbojet.design_altitude) conditions.freestream.mach_number = np.atleast_1d(turbojet.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(turbojet.design_altitude)) conditions.freestream.isentropic_expansion_factor = np.atleast_1d(turbojet.working_fluid.compute_gamma(T,p)) conditions.freestream.Cp = np.atleast_1d(turbojet.working_fluid.compute_cp(T,p)) conditions.freestream.R = np.atleast_1d(turbojet.working_fluid.gas_specific_constant) conditions.freestream.speed_of_sound = np.atleast_1d(a) conditions.freestream.velocity = np.atleast_1d(a*turbojet.design_mach_number) segment = RCAIDE.Framework.Mission.Segments.Segment() segment.state.conditions = conditions turbojet.append_operating_conditions(segment,conditions.energy,conditions.noise) ram = turbojet.ram inlet_nozzle = turbojet.inlet_nozzle low_pressure_compressor = turbojet.low_pressure_compressor high_pressure_compressor = turbojet.high_pressure_compressor combustor = turbojet.combustor high_pressure_turbine = turbojet.high_pressure_turbine low_pressure_turbine = turbojet.low_pressure_turbine core_nozzle = turbojet.core_nozzle # unpack component conditions turbojet_conditions = conditions.energy.propulsors[turbojet.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] lpc_conditions = conditions.energy.converters[low_pressure_compressor.tag] hpc_conditions = conditions.energy.converters[high_pressure_compressor.tag] lpt_conditions = conditions.energy.converters[low_pressure_turbine.tag] hpt_conditions = conditions.energy.converters[high_pressure_turbine.tag] combustor_conditions = conditions.energy.converters[combustor.tag] # Step 1: Set the working fluid to determine the fluid properties ram.working_fluid = turbojet.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 lpc_conditions.inputs.stagnation_temperature = inlet_nozzle_conditions.outputs.stagnation_temperature lpc_conditions.inputs.stagnation_pressure = inlet_nozzle_conditions.outputs.stagnation_pressure lpc_conditions.inputs.static_temperature = inlet_nozzle_conditions.outputs.static_temperature lpc_conditions.inputs.static_pressure = inlet_nozzle_conditions.outputs.static_pressure lpc_conditions.inputs.mach_number = inlet_nozzle_conditions.outputs.mach_number low_pressure_compressor.working_fluid = inlet_nozzle.working_fluid low_pressure_compressor.reference_temperature = turbojet.reference_temperature low_pressure_compressor.reference_pressure = turbojet.reference_pressure # Step 6: Compute flow through the low pressure compressor compute_compressor_performance(low_pressure_compressor,conditions) # Step 7: Link the high pressure compressor to the low pressure compressor hpc_conditions.inputs.stagnation_temperature = lpc_conditions.outputs.stagnation_temperature hpc_conditions.inputs.stagnation_pressure = lpc_conditions.outputs.stagnation_pressure hpc_conditions.inputs.static_temperature = lpc_conditions.outputs.static_temperature hpc_conditions.inputs.static_pressure = lpc_conditions.outputs.static_pressure hpc_conditions.inputs.mach_number = lpc_conditions.outputs.mach_number high_pressure_compressor.working_fluid = low_pressure_compressor.working_fluid high_pressure_compressor.reference_temperature = turbojet.reference_temperature high_pressure_compressor.reference_pressure = turbojet.reference_pressure # Step 8: Compute flow through the high pressure compressor compute_compressor_performance(high_pressure_compressor,conditions) # Step 9: Link the combustor to the high pressure compressor combustor_conditions.inputs.stagnation_temperature = hpc_conditions.outputs.stagnation_temperature combustor_conditions.inputs.stagnation_pressure = hpc_conditions.outputs.stagnation_pressure combustor_conditions.inputs.static_temperature = hpc_conditions.outputs.static_temperature combustor_conditions.inputs.static_pressure = hpc_conditions.outputs.static_pressure combustor_conditions.inputs.mach_number = hpc_conditions.outputs.mach_number combustor.working_fluid = high_pressure_compressor.working_fluid # Step 10: Compute flow through the high pressor compressor compute_combustor_performance(combustor,conditions) 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 = hpc_conditions.outputs hpt_conditions.inputs.bypass_ratio = 0.0 high_pressure_turbine.working_fluid = combustor.working_fluid # Step 11: Compute flow through the high pressure turbine compute_turbine_performance(high_pressure_turbine,conditions) # Step 12: 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 low_pressure_turbine.working_fluid = high_pressure_turbine.working_fluid lpt_conditions.inputs.compressor = lpc_conditions.outputs lpt_conditions.inputs.fuel_to_air_ratio = combustor_conditions.outputs.fuel_to_air_ratio lpt_conditions.inputs.bypass_ratio = 0.0 # Step 16: Compute flow through the low pressure turbine compute_turbine_performance(low_pressure_turbine,conditions) # Step 17: 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 # Step 18: Compute flow through the core nozzle compute_supersonic_nozzle_performance(core_nozzle,conditions) # Step 19: link the thrust component to the core nozzle turbojet_conditions.core_nozzle_area_ratio = core_nozzle_conditions.outputs.area_ratio turbojet_conditions.core_nozzle_static_pressure = core_nozzle_conditions.outputs.static_pressure turbojet_conditions.core_nozzle_exit_velocity = core_nozzle_conditions.outputs.velocity turbojet_conditions.fuel_to_air_ratio = combustor_conditions.outputs.fuel_to_air_ratio turbojet_conditions.stag_temp_lpt_exit = lpc_conditions.outputs.stagnation_temperature turbojet_conditions.stag_press_lpt_exit = lpc_conditions.outputs.stagnation_pressure turbojet_conditions.total_temperature_reference = lpc_conditions.outputs.stagnation_temperature turbojet_conditions.total_pressure_reference = lpc_conditions.outputs.stagnation_pressure turbojet_conditions.flow_through_core = 1.0 #scaled constant to turn on core thrust computation turbojet_conditions.flow_through_fan = 0.0 #scaled constant to turn on fan thrust computation # Step 20: Size the core of the turbojet size_core(turbojet,conditions) # Step 21: 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(turbojet, altitude = 0,velocity_range=np.array([V])) operating_state.conditions.energy.propulsors[turbojet.tag].throttle[:,0] = 1.0 sls_T,_,sls_P,_,_,_ = turbojet.compute_performance(operating_state) turbojet.sealevel_static_thrust = sls_T[0][0] turbojet.sealevel_static_power = sls_P[0][0] return