Source code for RCAIDE.Library.Mission.Segments.Climb.Constant_CAS_Constant_Rate

# RCAIDE/Library/Missions/Segments/Climb/Constant_CAS_Constant_Rate.py
# 
# 
# Created:  Jul 2023, M. Clarke

# ----------------------------------------------------------------------------------------------------------------------
#  IMPORT
# ----------------------------------------------------------------------------------------------------------------------
# RCAIDE 
from RCAIDE.Library.Mission.Common.Update.atmosphere import atmosphere
from RCAIDE.Framework.Core import Units

# Package imports  
import numpy as np
 
# ----------------------------------------------------------------------------------------------------------------------
#  Initialize Conditions
# ----------------------------------------------------------------------------------------------------------------------
[docs] def initialize_conditions(segment): """ Initializes conditions for constant calibrated airspeed climb segment Parameters ---------- segment : Segment The mission segment being analyzed Notes ----- This function sets up the initial conditions for a climb segment with constant calibrated airspeed (CAS) and constant rate of climb. It handles the conversion between CAS and true airspeed accounting for atmospheric effects. Also updates segment conditions with velocity vector, position vector, and altitude. **Required Segment Components** segment: - climb_rate : float Rate of climb [m/s] - calibrated_air_speed : float Calibrated airspeed [m/s] - altitude_start : float Initial altitude [m] - altitude_end : float Final altitude [m] - sideslip_angle : float Aircraft sideslip angle [rad] - state: numerics.dimensionless.control_points : array Discretization points [-] conditions : Data State conditions container - analyses: atmosphere : Model Atmospheric model for property calculations **Conversion Process** 1. Compute atmospheric properties at altitude 2. Convert CAS to equivalent airspeed (EAS) 3. Convert EAS to true airspeed (TAS) 4. Decompose TAS into velocity components **Major Assumptions** * Constant calibrated airspeed * Constant rate of climb * Standard atmosphere model * Small angle approximations * Subsonic flow Returns ------- None See Also -------- RCAIDE.Framework.Mission.Segments RCAIDE.Library.Mission.Common.Update.atmosphere """ # unpack climb_rate = segment.climb_rate cas = segment.calibrated_air_speed alt0 = segment.altitude_start altf = segment.altitude_end beta = segment.sideslip_angle t_nondim = segment.state.numerics.dimensionless.control_points conditions = segment.state.conditions # check for initial altitude if alt0 is None: if not segment.state.initials: raise AttributeError('initial altitude not set') alt0 = -1.0 * segment.state.initials.conditions.frames.inertial.position_vector[-1,2] # discretize on altitude alt = t_nondim * (altf-alt0) + alt0 # pack conditions conditions.freestream.altitude[:,0] = alt[:,0] # positive altitude in this context if cas is None: if not segment.state.initials: raise AttributeError('initial equivalent airspeed not set') v_mag = np.linalg.norm(segment.state.initials.conditions.frames.inertial.velocity_vector[-1,:]) else: # determine airspeed from calibrated airspeed atmosphere(segment) # get density for airspeed density = conditions.freestream.density[:,0] pressure = conditions.freestream.pressure[:,0] MSL_data = segment.analyses.atmosphere.compute_values(0.0,0.0) pressure0 = MSL_data.pressure[0] kcas = cas / Units.knots delta = pressure / pressure0 mach = 2.236*((((1+4.575e-7*kcas**2)**3.5-1)/delta + 1)**0.2857 - 1)**0.5 qc = pressure * ((1+0.2*mach**2)**3.5 - 1) eas = cas * (pressure/pressure0)**0.5*(((qc/pressure+1)**0.286-1)/((qc/pressure0+1)**0.286-1))**0.5 v_mag = eas/np.sqrt(density/MSL_data.density[0]) # process velocity vector v_z = -climb_rate # z points down v_xy = np.sqrt( v_mag**2 - v_z**2 ) v_x = np.cos(beta)*v_xy v_y = np.sin(beta)*v_xy # pack conditions conditions.frames.inertial.velocity_vector[:,0] = v_x conditions.frames.inertial.velocity_vector[:,1] = v_y conditions.frames.inertial.velocity_vector[:,2] = v_z conditions.frames.inertial.position_vector[:,2] = -alt[:,0] # z points down