Source code for RCAIDE.Library.Mission.Common.Pre_Process.set_residuals_and_unknowns

# RCAIDE/Library/Missions/Common/Pre_Process/set_residuals_and_unknowns.py
# 
# 
# Created:  Jul 2023, M. Clarke

# ----------------------------------------------------------------------------------------------------------------------
#  IMPORT
# ----------------------------------------------------------------------------------------------------------------------  
from RCAIDE.Framework.Core import Units

# ----------------------------------------------------------------------------------------------------------------------
#  set_residuals_and_unknowns
# ----------------------------------------------------------------------------------------------------------------------  
[docs] def set_residuals_and_unknowns(mission): """ Sets up flight dynamics residuals and control variables for mission segments Parameters ---------- mission : Mission The mission containing segments to be analyzed - state.ones_row : function Creates array of ones - assigned_control_variables : Data Control variable configurations - flight_dynamics : Data Force/moment flags - state.residuals : Data Storage for residuals - state.unknowns : Data Storage for unknowns Returns ------- None Updates mission segment states directly Notes ----- This function configures the flight dynamics problem for each segment by setting up force/moment residuals and initializing control variables. It handles a comprehensive set of flight controls and dynamics states. The function processes: 1. Force and moment residuals (degrees of freedom) 2. Control variable initialization including: - Body angles - Bank angles - Wind angles - Throttle settings - Velocity and acceleration - Time parameters - Control surface deflections * Elevator * Rudder * Flaps * Slats * Ailerons - Thrust vectoring **Control Variable Initialization** For each control: 1. Check if active 2. Use provided initial values if available 3. Apply default values if needed 4. Track number of controls **Major Assumptions** * Valid control configurations * Proper degrees of freedom setup * Compatible control assignments * Valid initial guess values * Units in standard format See Also -------- RCAIDE.Framework.Mission.Segments """ for segment in mission.segments: ones_row = segment.state.ones_row ctrls = segment.assigned_control_variables dynamics = segment.flight_dynamics # assign force and moment residuals i.e. degrees of freedom num_DOF = 0 if dynamics.force_x == True: segment.state.residuals.force_x = ones_row(1) *0 num_DOF += 1 if dynamics.force_y == True: segment.state.residuals.force_y = ones_row(1) *0 num_DOF += 1 if dynamics.force_z == True: segment.state.residuals.force_z = ones_row(1) *0 num_DOF += 1 if dynamics.moment_x == True: segment.state.residuals.moment_x = ones_row(1) *0 num_DOF += 1 if dynamics.moment_y == True: segment.state.residuals.moment_y = ones_row(1) *0 num_DOF += 1 if dynamics.moment_z == True: segment.state.residuals.moment_z = ones_row(1) *0 num_DOF += 1 # assign control variables ones_row = segment.state.ones_row num_ctrls = 0 # Body Angle if ctrls.body_angle.active: if ctrls.body_angle.initial_guess_values != None: segment.state.unknowns.body_angle = ones_row(1) * ctrls.body_angle.initial_guess_values[0][0] else: segment.state.unknowns.body_angle = ones_row(1) * 3.0 * Units.degrees num_ctrls += 1 # Bank Angle if ctrls.bank_angle.active: if ctrls.bank_angle.initial_guess_values != None: segment.state.unknowns.bank_angle = ones_row(1) * ctrls.bank_angle.initial_guess_values[0][0] else: segment.state.unknowns.bank_angle = ones_row(1) * 0.0 * Units.degrees num_ctrls += 1 # Wing Angle if ctrls.wind_angle.active: if ctrls.wind_angle.initial_guess_values != None: segment.state.unknowns.wind_angle = ones_row(1) * ctrls.wind_angle.initial_guess_values[0][0] else: segment.state.unknowns.wind_angle = ones_row(1) * 1.0 * Units.degrees num_ctrls += 1 # Throttle if ctrls.throttle.active: for i in range(len(ctrls.throttle.assigned_propulsors)): if ctrls.throttle.initial_guess_values != None: segment.state.unknowns["throttle_" + str(i)] = ones_row(1) * ctrls.throttle.initial_guess_values[i][0] else: segment.state.unknowns["throttle_" + str(i)] = ones_row(1) * 0.5 num_ctrls += 1 # Velocity if ctrls.velocity.active: if ctrls.velocity.initial_guess_values != None: segment.state.unknowns.velocity = ones_row(1) * ctrls.velocity.initial_guess_values[0][0] else: segment.state.unknowns.velocity = ones_row(1) * 100 num_ctrls += 1 # Acceleration if ctrls.acceleration.active: if ctrls.acceleration.initial_guess_values != None: segment.state.unknowns.acceleration = ones_row(1) * ctrls.acceleration.initial_guess_values[0][0] else: segment.state.unknowns.acceleration = ones_row(1) * 1. num_ctrls += 1 # Time if ctrls.elapsed_time.active: if ctrls.elapsed_time.initial_guess_values != None: segment.state.unknowns.elapsed_time = ctrls.elapsed_time.initial_guess_values[0][0] else: segment.state.unknowns.elapsed_time = 10 num_ctrls += 1 # Elevator if ctrls.elevator_deflection.active: if ctrls.elevator_deflection.initial_guess_values!= None: segment.state.unknowns["elevator"] = ones_row(1) * ctrls.elevator_deflection.initial_guess_values[0][0] else: segment.state.unknowns["elevator" ] = ones_row(1) * 0.0 * Units.degrees num_ctrls += 1 # Elevator if ctrls.rudder_deflection.active: if ctrls.rudder_deflection.initial_guess_values != None: segment.state.unknowns["rudder" ] = ones_row(1) * ctrls.rudder_deflection.initial_guess_values[0][0] else: segment.state.unknowns["rudder" ] = ones_row(1) * 0.0 * Units.degrees num_ctrls += 1 # Flap if ctrls.flap_deflection.active: if ctrls.flap_deflection.initial_guess_values != None: segment.state.unknowns["flap" ] = ones_row(1) * ctrls.flap_deflection.initial_guess_values[0][0] else: segment.state.unknowns["flap" ] = ones_row(1) * 0.0 * Units.degrees num_ctrls += 1 # Slat if ctrls.slat_deflection.active: if ctrls.slat_deflection.initial_guess_values != None: segment.state.unknowns["slat" ] = ones_row(1) * ctrls.slat_deflection.initial_guess_values[0][0] else: segment.state.unknowns["slat" ] = ones_row(1) * 0.0 * Units.degrees num_ctrls += 1 # Aileron if ctrls.aileron_deflection.active: for i in range(len(ctrls.aileron_deflection.assigned_surfaces)): if ctrls.aileron_deflection.initial_guess_values != None: segment.state.unknowns["aileron" ] = ones_row(1) * ctrls.aileron_deflection.initial_guess_values[0][0] else: segment.state.unknowns["aileron" ] = ones_row(1) * 0.0 * Units.degrees num_ctrls += 1 ## Thrust Vector Angle #if ctrls.thrust_vector_angle.active: #for i in range(len(ctrls.thrust_vector_angle.assigned_propulsors)): #if ctrls.thrust_vector_angle.initial_guess_values != None: #segment.state.unknowns["thrust_vector_" + str(i)] = ones_row(1) * ctrls.thrust_vector_angle.initial_guess_values[i][0] #else: #segment.state.unknowns["thrust_vector_" + str(i)] = ones_row(1) * 0.0 * Units.degrees #num_ctrls += 1 #if ctrls.rotor_blade_pitch_command.active: #for i in range(len(ctrls.rotor_blade_pitch_command.assigned_propulsors)): #if ctrls.rotor_blade_pitch_command.initial_guess_values != None: #segment.state.unknowns["blade_pitch_command_" + str(i)] = ones_row(1) * ctrls.rotor_blade_pitch_command.initial_guess_values[i][0] #else: #segment.state.unknowns["blade_pitch_command_" + str(i)] = ones_row(1) * 0.0 * Units.degrees #num_ctrls += 1 return