Source code for RCAIDE.Library.Mission.Segments.Cruise.Constant_Throttle_Constant_Altitude
# RCAIDE/Library/Missions/Segments/Cruise/Constant_Throttle_Constant_Altitude.py
#
#
# Created: Jul 2023, M. Clarke
# ----------------------------------------------------------------------------------------------------------------------
# IMPORT
# ----------------------------------------------------------------------------------------------------------------------
# Package imports
import numpy as np
# ----------------------------------------------------------------------------------------------------------------------
# Initialize Conditions
# ----------------------------------------------------------------------------------------------------------------------
[docs]
def unpack_unknowns(segment):
# unpack unknowns
unknowns = segment.state.unknowns
accel_x = unknowns.acceleration
time = unknowns.elapsed_time
# rescale time
t_initial = segment.state.conditions.frames.inertial.time[0,0]
t_final = t_initial + time
t_nondim = segment.state.numerics.dimensionless.control_points
time = t_nondim * (t_final-t_initial) + t_initial
# build acceleration
N = segment.state.numerics.number_of_control_points
a = np.zeros((N, 3))
a[:, 0] = accel_x[:,0]
# apply unknowns
conditions = segment.state.conditions
conditions.frames.inertial.acceleration_vector = a
conditions.frames.inertial.time[:,0] = time[:,0]
return
# ----------------------------------------------------------------------
# Integrate Velocity
# ----------------------------------------------------------------------
[docs]
def integrate_velocity(segment):
# unpack
conditions = segment.state.conditions
v0 = segment.air_speed_start
beta = segment.sideslip_angle
I = segment.state.numerics.time.integrate
a = conditions.frames.inertial.acceleration_vector
# compute x-velocity
velocity_xy = v0 + np.dot(I, a)[:,0]
v_x = np.cos(beta)*velocity_xy
v_y = np.sin(beta)*velocity_xy
# pack velocity
conditions.frames.inertial.velocity_vector[:,0] = v_x
conditions.frames.inertial.velocity_vector[:,1] = v_y
return
# ----------------------------------------------------------------------
# Initialize Conditions
# ----------------------------------------------------------------------
[docs]
def initialize_conditions(segment):
"""Sets the specified conditions which are given for the segment type.
Assumptions:
Constant throttle and constant altitude, allows for acceleration
Source:
N/A
Inputs:
segment.altitude [meters]
segment.air_speed_start [meters/second]
segment.air_speed_end [meters/second]
segment.state.numerics.number_of_control_points [int]
Outputs:
conditions.frames.inertial.position_vector [meters]
conditions.freestream.altitude [meters]
Properties Used:
N/A
"""
# unpack inputs
alt = segment.altitude
v0 = segment.air_speed_start
vf = segment.air_speed_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:
if not segment.state.initials: raise AttributeError('airspeed not set')
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
# pack conditions
segment.state.conditions.freestream.altitude[:,0] = alt
segment.state.conditions.frames.inertial.position_vector[:,2] = -alt # z points down
# ----------------------------------------------------------------------
# Solve Residuals
# ----------------------------------------------------------------------
[docs]
def solve_velocity(segment):
""" Calculates the additional velocity residual
Assumptions:
The vehicle accelerates, residual on forces and to get it to the final speed
Inputs:
segment.air_speed_end [meters/second]
segment.state.conditions:
frames.inertial.velocity_vector [meters/second]
segment.state.numerics.time.differentiate
Outputs:
segment.state.residuals:
forces [meters/second^2]
final_velocity_error [meters/second]
Properties Used:
N/A
"""
# unpack inputs
conditions = segment.state.conditions
vf = segment.air_speed_end
v = conditions.frames.inertial.velocity_vector
segment.state.residuals.final_velocity_error = (np.linalg.norm(v[-1,:])- vf)
return