Source code for RCAIDE.Library.Mission.Segments.Ground.Takeoff

# RCAIDE/Library/Missions/Segments/Ground/Takeoff.py
# 
# 
# Created:  Jul 2023, M. Clarke  

# ----------------------------------------------------------------------------------------------------------------------
#  IMPORT
# ----------------------------------------------------------------------------------------------------------------------
# RCAIDE Imports  
import numpy as np 

# ----------------------------------------------------------------------------------------------------------------------
# unpack unknowns
# ---------------------------------------------------------------------------------------------------------------------- 
[docs] def initialize_conditions(segment): """ Initializes conditions for aircraft takeoff ground roll Parameters ---------- segment : Segment The mission segment being analyzed - altitude : float Ground altitude [m] - velocity_start : float Initial ground speed [m/s] - velocity_end : float Rotation speed [m/s] - ground_incline : float Runway incline angle [rad] - friction_coefficient : float Ground friction coefficient [-] - state: numerics: dimensionless: control_points : array Discretization points [-] conditions : Data State conditions container unknowns: ground_velocity : array Ground velocity profile [m/s] initials : Data, optional Initial conditions from previous segment - analyses: weights: vehicle: mass_properties: takeoff : float Aircraft takeoff mass [kg] Returns ------- None Updates segment conditions directly: - conditions.frames.inertial.velocity_vector [m/s] - conditions.ground.incline [rad] - conditions.ground.friction_coefficient [-] - conditions.freestream.altitude [m] - conditions.frames.inertial.position_vector [m] - conditions.weights.total_mass [kg] Notes ----- This function sets up the initial conditions for a ground takeoff segment with acceleration from initial speed to rotation speed. The segment handles ground effects, friction, and incline during the takeoff roll. **Calculation Process** 1. Check initial conditions 2. Initialize velocity profile: v = v0 + (vf - v0)*t where: - v0 is initial speed - vf is rotation speed - t is normalized time/distance 3. Set ground conditions: - Friction coefficient - Ground incline 4. Set position and altitude 5. Set aircraft mass **Major Assumptions** * Constant friction coefficient * Constant ground incline * Linear velocity increase * Quasi-steady acceleration * Small minimum velocity for numerical stability See Also -------- RCAIDE.Framework.Mission.Segments """ # use the common initialization # unpack inputs alt = segment.altitude v0 = segment.velocity_start vf = segment.velocity_end # check for initial altitude if alt is None: if not segment.state.initials: raise AttributeError('altitude not set') alt = -1.0 *segment.state.initials.conditions.frames.inertial.position_vector[-1,2] if v0 is None: v0 = np.linalg.norm(segment.state.initials.conditions.frames.inertial.velocity_vector[-1]) # avoid having zero velocity since aero and propulsion models need non-zero Reynolds number if v0 == 0.0: v0 = 0.01 if vf == 0.0: vf = 0.01 # intial and final speed cannot be the same if v0 == vf: vf = vf + 0.01 # repack segment.air_speed_start = v0 segment.air_speed_end = vf initialized_velocity = (vf - v0)*segment.state.numerics.dimensionless.control_points + v0 # Initialize the x velocity unknowns to speed convergence: segment.state.unknowns.ground_velocity = initialized_velocity[1:,0] # pack conditions conditions = segment.state.conditions conditions.frames.inertial.velocity_vector[:,0] = initialized_velocity[:,0] conditions.ground.incline[:,0] = segment.ground_incline conditions.ground.friction_coefficient[:,0] = segment.friction_coefficient conditions.freestream.altitude[:,0] = alt conditions.frames.inertial.position_vector[:,2] = -alt conditions.weights.total_mass[:,0] = segment.analyses.aerodynamics.vehicle.mass_properties.takeoff conditions.frames.inertial.position_vector[:,:] = conditions.frames.inertial.position_vector[0,:][None,:][:,:]