Source code for RCAIDE.Library.Mission.Common.Residuals.flight_dynamics

# RCAIDE/Library/Missions/Common/Residuals/flight_dynamics.py
# 
# 
# Created:  Jul 2023, M. Clarke

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

import RCAIDE
import numpy as np 

# ----------------------------------------------------------------------------------------------------------------------
#  Residual Total Forces
# ---------------------------------------------------------------------------------------------------------------------- 
[docs] def flight_dynamics(segment): """ Evaluates flight dynamics residuals for mission segment analysis Parameters ---------- segment : Segment The mission segment being analyzed Returns ------- None Updates segment residuals directly Notes ----- This function calculates the residuals for force and moment equations in all three axes. It handles special cases for transition and ground segments, including acceleration calculations and final velocity constraints. The function processes: 1. Force equation residuals (F = ma) 2. Moment equation residuals (M = Iα) 3. Special handling for: - Transition segments - Ground operations (takeoff, landing) **Required Segment State Variables** state.conditions.frames.inertial: - velocity_vector : array Vehicle velocity [m/s] - acceleration_vector : array Vehicle acceleration [m/s²] - total_force_vector : array Net forces [N] - total_moment_vector : array Net moments [N⋅m] - angular_velocity_vector : array Angular rates [rad/s] - angular_acceleration_vector : array Angular accelerations [rad/s²] state.conditions.weights: - total_mass : array Vehicle mass [kg] analyses.aerodynamics.vehicle.mass_properties: - moments_of_inertia.tensor : array Inertia tensor [kg⋅m²] **Segment Types** Special handling for: - Transition segments * Constant acceleration * Constant angle * Linear climb - Ground segments * Takeoff * Landing * Ground operations **Major Assumptions** * Rigid body dynamics * Principal axes aligned with body axes * Constant inertia properties * Valid mass properties * Non-zero final velocity for ground segments See Also -------- RCAIDE.Framework.Mission.Segments RCAIDE.Framework.Mission.Segments.Transition RCAIDE.Framework.Mission.Segments.Ground """ transition_seg_flag = type(segment) == RCAIDE.Framework.Mission.Segments.Transition.Constant_Acceleration_Constant_Angle_Linear_Climb ground_seg_flag = (type(segment) == RCAIDE.Framework.Mission.Segments.Ground.Landing) or\ (type(segment) == RCAIDE.Framework.Mission.Segments.Ground.Takeoff) or \ (type(segment) == RCAIDE.Framework.Mission.Segments.Ground.Ground) if transition_seg_flag or ground_seg_flag: v = segment.state.conditions.frames.inertial.velocity_vector D = segment.state.numerics.time.differentiate segment.state.conditions.frames.inertial.acceleration_vector = np.dot(D,v) FT = segment.state.conditions.frames.inertial.total_force_vector a = segment.state.conditions.frames.inertial.acceleration_vector if transition_seg_flag: omega = segment.state.conditions.frames.inertial.angular_velocity_vector D = segment.state.numerics.time.differentiate segment.state.conditions.frames.inertial.angular_acceleration_vector = np.dot(D,omega) MT = segment.state.conditions.frames.inertial.total_moment_vector ang_acc = segment.state.conditions.frames.inertial.angular_acceleration_vector m = segment.state.conditions.weights.total_mass I = segment.analyses.aerodynamics.vehicle.mass_properties.moments_of_inertia.tensor if ground_seg_flag: vf = segment.velocity_end if vf == 0.0: vf = 0.01 segment.state.residuals.force_x[:,0] = FT[1:,0]/m[1:,0] - a[1:,0] segment.state.residuals.final_velocity_error = (v[-1,0] - vf) else: if segment.flight_dynamics.force_x: segment.state.residuals.force_x[:,0] = FT[:,0]/m[:,0] - a[:,0] if segment.flight_dynamics.force_y: segment.state.residuals.force_y[:,0] = FT[:,1]/m[:,0] - a[:,1] if segment.flight_dynamics.force_z: segment.state.residuals.force_z[:,0] = FT[:,2]/m[:,0] - a[:,2] if segment.flight_dynamics.moment_x: segment.state.residuals.moment_x[:,0] = MT[:,0]/I[0,0] - ang_acc[:,0] if segment.flight_dynamics.moment_y: segment.state.residuals.moment_y[:,0] = MT[:,1]/I[1,1] - ang_acc[:,1] if segment.flight_dynamics.moment_z: segment.state.residuals.moment_z[:,0] = MT[:,2]/I[2,2] - ang_acc[:,2] return