Source code for RCAIDE.Library.Methods.Powertrain.Converters.Turboshaft.compute_turboshaft_performance

# RCAIDE/Methods/Library/Methods/Powertrain/Converters/compute_turboshaft_performance.py
# 
# 
# Created:  Jul 2023, M. Clarke

# ----------------------------------------------------------------------------------------------------------------------
#  IMPORT
# ----------------------------------------------------------------------------------------------------------------------
# RCAIDE imports      
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.Converters.Turboshaft         import compute_power
 
# python imports 
from copy import deepcopy 
# ----------------------------------------------------------------------------------------------------------------------
# compute_turboshaft_performance
# ---------------------------------------------------------------------------------------------------------------------- 
[docs] def compute_turboshaft_performance(turboshaft,state,fuel_line=None,bus=None): """ Computes the perfomrance of a turboshaft Parameters ---------- turboshaft : RCAIDE.Library.Components.Converters.Turboshaft Turboshaft engine component with the following attributes: - tag : str Identifier for the turboshaft - working_fluid : Data Working fluid properties object - ram : Data Ram component - tag : str Identifier for the ram - inlet_nozzle : Data Inlet nozzle component - tag : str Identifier for the inlet nozzle - compressor : Data Compressor component - tag : str Identifier for the compressor - combustor : Data Combustor component - tag : str Identifier for the combustor - high_pressure_turbine : Data High pressure turbine component - tag : str Identifier for the high pressure turbine - low_pressure_turbine : Data Low pressure turbine component - tag : str Identifier for the low pressure turbine - core_nozzle : Data Core nozzle component - tag : str Identifier for the core nozzle state : RCAIDE.Framework.Mission.Common.State State object containing: - conditions : Data Flight conditions - freestream : Data Freestream properties - density : numpy.ndarray Air density [kg/m³] - noise : dict Noise conditions indexed by component tag - energy : dict Energy conditions indexed by component tag center_of_gravity : list of lists, optional Center of gravity coordinates [[x, y, z]] [m]. Default: [[0.0, 0.0, 0.0]] Returns ------- thrust : numpy.ndarray Thrust force vector [N] moment : numpy.ndarray Moment vector [N·m] power : numpy.ndarray Shaft power output [W] stored_results_flag : bool Flag indicating if results are stored stored_propulsor_tag : str Tag of the turboshaft with stored results Notes ----- This function computes the performance of a turboshaft engine by sequentially analyzing each component in the engine's thermodynamic cycle. It links the output conditions of each component to the input conditions of the next component in the flow path. The function follows this sequence: 1. Set working fluid properties 2. Compute ram performance 3. Compute inlet nozzle performance 4. Compute compressor performance 5. Compute combustor performance 6. Compute high pressure turbine performance 7. Compute low pressure turbine performance 8. Compute core nozzle performance 9. Compute power output **Major Assumptions** * Steady state operation * One-dimensional flow through components * Adiabatic components except for the combustor * Perfect gas behavior with variable properties References ---------- [1] Mattingly, J.D., "Elements of Gas Turbine Propulsion", 2nd Edition, AIAA Education Series, 2005. https://soaneemrana.org/onewebmedia/ELEMENTS%20OF%20GAS%20TURBINE%20PROPULTION2.pdf See Also -------- RCAIDE.Library.Methods.Powertrain.Converters.Turboshaft.compute_power """ conditions = state.conditions ram = turboshaft.ram inlet_nozzle = turboshaft.inlet_nozzle compressor = turboshaft.compressor combustor = turboshaft.combustor high_pressure_turbine = turboshaft.high_pressure_turbine low_pressure_turbine = turboshaft.low_pressure_turbine core_nozzle = turboshaft.core_nozzle # unpack component conditions turboshaft_conditions = conditions.energy.converters[turboshaft.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] 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 = turboshaft.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 # Step 6: Compute flow through the low pressure compressor compute_compressor_performance(compressor,conditions) # Step 11: 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 12: 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 hpt_conditions.inputs.bypass_ratio = 0.0 hpt_conditions.inputs.fan = Data() hpt_conditions.inputs.fan.work_done = 0.0 high_pressure_turbine.working_fluid = combustor.working_fluid 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 low_pressure_turbine.working_fluid = high_pressure_turbine.working_fluid 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.fuel_to_air_ratio = combustor_conditions.outputs.fuel_to_air_ratio lpt_conditions.inputs.bypass_ratio = 0.0 lpt_conditions.inputs.fan = Data() lpt_conditions.inputs.fan.work_done = 0.0 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) # Link the thrust component to the core nozzle turboshaft_conditions.core_exit_velocity = core_nozzle_conditions.outputs.velocity turboshaft_conditions.core_area_ratio = core_nozzle_conditions.outputs.area_ratio turboshaft_conditions.core_nozzle = core_nozzle_conditions.outputs # Link the thrust component to the combustor turboshaft_conditions.fuel_to_air_ratio = combustor_conditions.outputs.fuel_to_air_ratio # Link the thrust component to the low pressure compressor turboshaft_conditions.combustor_stagnation_temperature = combustor_conditions.outputs.stagnation_temperature turboshaft_conditions.total_temperature_reference = compressor_conditions.inputs.stagnation_temperature turboshaft_conditions.total_pressure_reference = compressor_conditions.inputs.stagnation_pressure turboshaft_conditions.flow_through_core = 1.0 #scaled constant to turn on core thrust computation turboshaft_conditions.flow_through_fan = 0.0 #scaled constant to turn on fan thrust computation # Compute the power compute_power(turboshaft,conditions) compressor_conditions.omega = compressor.design_angular_velocity * turboshaft_conditions.throttle # Pack results power = turboshaft_conditions.power stored_results_flag = True stored_propulsor_tag = turboshaft.tag return power,stored_results_flag,stored_propulsor_tag
[docs] def reuse_stored_turboshaft_data(turboshaft,state,network,fuel_line,bus,stored_converter_tag): '''Reuses results from one turboshaft for identical propulsors Assumptions: N/A Source: N/A Inputs: conditions - operating conditions data structure [-] fuel_line - fuelline [-] turboshaft - turboshaft data structure [-] total_power - power of turboshaft group [W] Outputs: total_power - power of turboshaft group [W] Properties Used: N.A. ''' conditions = state.conditions turboshaft = turboshaft.turboshaft ram = turboshaft.ram inlet_nozzle = turboshaft.inlet_nozzle compressor = turboshaft.compressor high_pressure_compressor = turboshaft.high_pressure_compressor combustor = turboshaft.combustor low_pressure_turbine = turboshaft.low_pressure_turbine core_nozzle = turboshaft.core_nozzle turboshaft_0 = fuel_line.converters[stored_converter_tag].turboshaft ram_0 = fuel_line.converters[stored_converter_tag].ram inlet_nozzle_0 = fuel_line.converters[stored_converter_tag].inlet_nozzle compressor_0 = fuel_line.converters[stored_converter_tag].compressor high_pressure_compressor_0 = fuel_line.converters[stored_converter_tag].high_pressure_compressor combustor_0 = fuel_line.converters[stored_converter_tag].combustor low_pressure_turbine_0 = fuel_line.converters[stored_converter_tag].low_pressure_turbine core_nozzle_0 = fuel_line.converters[stored_converter_tag].core_nozzle # deep copy results conditions.energy.converters[turboshaft.tag] = deepcopy(conditions.energy.converters[turboshaft_0.tag] ) conditions.energy.converters[ram.tag] = deepcopy(conditions.energy.converters[ram_0.tag] ) conditions.energy.converters[inlet_nozzle.tag] = deepcopy(conditions.energy.converters[inlet_nozzle_0.tag] ) conditions.energy.converters[compressor.tag] = deepcopy(conditions.energy.converters[compressor_0.tag] ) conditions.energy.converters[high_pressure_compressor.tag] = deepcopy(conditions.energy.converters[high_pressure_compressor_0.tag]) conditions.energy.converters[combustor.tag] = deepcopy(conditions.energy.converters[combustor_0.tag] ) conditions.energy.converters[low_pressure_turbine.tag] = deepcopy(conditions.energy.converters[low_pressure_turbine_0.tag] ) conditions.energy.converters[core_nozzle.tag] = deepcopy(conditions.energy.converters[core_nozzle_0.tag] ) P_mech = conditions.energy.converters[turboshaft.tag].power P_elec = P_mech * 0 return P_mech , P_elec