# RCAIDE/Library/Methods/Aerodynamics/Vortex_Lattice_Method/train_VLM_surrogates.py
#
# ----------------------------------------------------------------------------------------------------------------------
# IMPORT
# ----------------------------------------------------------------------------------------------------------------------
# RCAIDE imports
import RCAIDE
from RCAIDE.Framework.Core import Data
from RCAIDE.Library.Methods.Aerodynamics.Vortex_Lattice_Method.VLM import VLM
from copy import deepcopy
# package imports
import numpy as np
# ----------------------------------------------------------------------------------------------------------------------
# Vortex_Lattice
# ----------------------------------------------------------------------------------------------------------------------
[docs]
def train_VLM_surrogates(aerodynamics):
"""Call methods to run VLM for sample point evaluation.
Assumptions:
CY_beta multiplied by 2, verified against literature and AVL
CL_p multiplied by -2, verified against literature and AVL
CM_q multiplied by 10, verified against literature and AVL
CN_p multiplied by -3, verified against literature and AVL
CN_r multiplied by 3, verified against literature and AVL
CL_delta_a multiplied by -1, verified against literature and AVL
CLift_delta_e multiplied by 0.5, verified against literature and AVL
CY_alpha multiplied by 0, based on theory
CL_beta multiplied by -1, verified against literature and AVL
p derivatives multiplied by -10, verified against literature and AVL
r derivatives multiplied by -10, verified against literature and AVL
Rudder derivatives multiplied by -1, verified against literature
Aileron derivatives multiplied by -1, verified against literature
Source:
None
Args:
aerodynamics : VLM analysis [unitless]
Returns:
None
"""
Mach = aerodynamics.training.Mach
training = aerodynamics.training
sub_len = int(sum(Mach<1.))
sub_Mach = Mach[:sub_len]
sup_Mach = Mach[sub_len:]
training.subsonic = train_model(aerodynamics, sub_Mach)
# only build supersonic surrogates if necessary
if len(sup_Mach) > 2:
training.supersonic = train_model(aerodynamics, sup_Mach)
training.transonic = train_trasonic_model(aerodynamics, training.subsonic,training.supersonic,sub_Mach, sup_Mach)
else:
training.supersonic = None
training.transonic = None
return
[docs]
def train_model(aerodynamics, Mach):
"""Sub function that call methods to run VLM for sample point evaluation.
Assumptions:
None
Source:
None
Args:
aerodynamics : VLM analysis [unitless]
Returns:
None
"""
vehicle = deepcopy(aerodynamics.vehicle)
settings = aerodynamics.settings
AoA = aerodynamics.training.angle_of_attack
Beta = aerodynamics.training.sideslip_angle
training = Data()
training.Mach = Mach
# loop through wings to determine what control surfaces are present
for wing in vehicle.wings:
for control_surface in wing.control_surfaces:
control_surface.deflection = 0.0
if type(control_surface) == RCAIDE.Library.Components.Wings.Control_Surfaces.Aileron:
delta_a = aerodynamics.training.aileron_deflection
len_d_a = len(delta_a)
aerodynamics.aileron_flag = True
if type(control_surface) == RCAIDE.Library.Components.Wings.Control_Surfaces.Elevator:
delta_e = aerodynamics.training.elevator_deflection
len_d_e = len(delta_e)
aerodynamics.elevator_flag = True
if type(control_surface) == RCAIDE.Library.Components.Wings.Control_Surfaces.Rudder:
delta_r = aerodynamics.training.rudder_deflection
aerodynamics.rudder_flag = True
len_d_r = len(delta_r)
if type(control_surface) == RCAIDE.Library.Components.Wings.Control_Surfaces.Slat:
delta_s = aerodynamics.training.slat_deflection
len_d_s = len(delta_s)
aerodynamics.slat_flag = True
if type(control_surface) == RCAIDE.Library.Components.Wings.Control_Surfaces.Flap:
delta_f = aerodynamics.training.rudder_deflection
len_d_f = len(delta_f)
aerodynamics.flap_flag = True
u = aerodynamics.training.u
v = aerodynamics.training.v
w = aerodynamics.training.w
pitch_rate = aerodynamics.training.pitch_rate
roll_rate = aerodynamics.training.roll_rate
yaw_rate = aerodynamics.training.yaw_rate
len_Mach = len(Mach)
len_AoA = len(AoA)
len_Beta = len(Beta)
len_u = len(u)
len_v = len(v)
len_w = len(w)
len_q = len(pitch_rate)
len_p = len(roll_rate)
len_r = len(yaw_rate)
# --------------------------------------------------------------------------------------------------------------
# Alpha
# --------------------------------------------------------------------------------------------------------------
# Setup new array shapes for vectorization
# stakcing 9x9 matrices into one horizontal line(81)
AoAs = np.atleast_2d(np.tile(AoA,len_Mach).T.flatten()).T
Machs = np.atleast_2d(np.repeat(Mach,len_AoA)).T
# reset conditions
conditions = RCAIDE.Framework.Mission.Common.Results()
conditions.freestream.mach_number = Machs
conditions.aerodynamics.angles.alpha = np.ones_like(Machs)*AoAs
VLM_results = VLM(conditions,settings,vehicle)
Clift_res = VLM_results.CLift
Cdrag_res = VLM_results.CDrag_induced
CX_res = VLM_results.CX
CY_res = VLM_results.CY
CZ_res = VLM_results.CZ
CL_res = VLM_results.CL
CM_res = VLM_results.CM
CN_res = VLM_results.CN
S_ref = VLM_results.S_ref
b_ref = VLM_results.b_ref
c_ref = VLM_results.c_ref
X_ref = VLM_results.X_ref
Y_ref = VLM_results.Y_ref
Z_ref = VLM_results.Z_ref
Clift_alpha = np.reshape(Clift_res,(len_Mach,len_AoA)).T
Cdrag_alpha = np.reshape(Cdrag_res,(len_Mach,len_AoA)).T
CX_alpha = np.reshape(CX_res,(len_Mach,len_AoA)).T
CY_alpha = np.reshape(CY_res,(len_Mach,len_AoA)).T
CZ_alpha = np.reshape(CZ_res,(len_Mach,len_AoA)).T
CL_alpha = np.reshape(CL_res,(len_Mach,len_AoA)).T
CM_alpha = np.reshape(CM_res,(len_Mach,len_AoA)).T
CN_alpha = np.reshape(CN_res,(len_Mach,len_AoA)).T
# Angle of Attack at 0 Degrees
Clift_alpha_0 = np.tile(Clift_alpha[2][None,:],(2,1))
Cdrag_alpha_0 = np.tile(Cdrag_alpha[2][None,:],(2,1))
CX_alpha_0 = np.tile(CX_alpha[2][None,:],(2, 1))
CY_alpha_0 = 0 * np.tile(CY_alpha[2][None,:],(2, 1))
CZ_alpha_0 = np.tile(CZ_alpha[2][None,:],(2, 1))
CL_alpha_0 = 0 * np.tile(CL_alpha[2][None,:],(2, 1))
CM_alpha_0 = np.tile(CM_alpha[2][None,:],(2, 1))
CN_alpha_0 = 0 * np.tile(CN_alpha[2][None,:],(2, 1))
aerodynamics.reference_values.S_ref = S_ref
aerodynamics.reference_values.b_ref = b_ref
aerodynamics.reference_values.c_ref = c_ref
aerodynamics.reference_values.X_ref = X_ref
aerodynamics.reference_values.Y_ref = Y_ref
aerodynamics.reference_values.Z_ref = Z_ref
aerodynamics.reference_values.aspect_ratio = (b_ref ** 2) / S_ref
Clift_wing_alpha = Data()
Cdrag_wing_alpha = Data()
for wing in vehicle.wings:
Clift_wing_alpha[wing.tag] = np.reshape(VLM_results.CLift_wings[wing.tag],(len_Mach,len_AoA)).T
Cdrag_wing_alpha[wing.tag] = np.reshape(VLM_results.CDrag_induced_wings[wing.tag],(len_Mach,len_AoA)).T
# --------------------------------------------------------------------------------------------------------------
# Beta
# --------------------------------------------------------------------------------------------------------------
Betas = np.atleast_2d(np.tile(Beta,len_Mach).T.flatten()).T
Machs = np.atleast_2d(np.repeat(Mach,len_Beta)).T
conditions = RCAIDE.Framework.Mission.Common.Results()
conditions.expand_rows(rows= len(Machs))
conditions.freestream.mach_number = Machs
conditions.aerodynamics.angles.alpha = np.ones_like(Machs) *1E-12
conditions.aerodynamics.angles.beta = np.ones_like(Machs)*Betas
VLM_results = VLM(conditions,settings,vehicle)
Clift_res = VLM_results.CLift
Cdrag_res = VLM_results.CDrag_induced
CX_res = VLM_results.CX
CY_res = VLM_results.CY
CZ_res = VLM_results.CZ
CL_res = VLM_results.CL
CM_res = VLM_results.CM
CN_res = VLM_results.CN
Clift_beta = np.reshape(Clift_res,(len_Mach,len_Beta)).T - Clift_alpha_0
Cdrag_beta = np.reshape(Cdrag_res,(len_Mach,len_Beta)).T - Cdrag_alpha_0
CX_beta = np.reshape(CX_res,(len_Mach,len_Beta)).T - CX_alpha_0
CY_beta = np.reshape(CY_res,(len_Mach,len_Beta)).T - CY_alpha_0
CZ_beta = np.reshape(CZ_res,(len_Mach,len_Beta)).T - CZ_alpha_0
CL_beta = - (np.reshape(CL_res,(len_Mach,len_Beta)).T - CL_alpha_0)
CM_beta = np.reshape(CM_res,(len_Mach,len_Beta)).T - CM_alpha_0
CN_beta = np.reshape(CN_res,(len_Mach,len_Beta)).T - CN_alpha_0
# -------------------------------------------------------
# Velocity u
# -------------------------------------------------------
u_s = np.atleast_2d(np.tile(u, len_Mach).T.flatten()).T
Machs = np.atleast_2d(np.repeat(Mach,len_u)).T
conditions = RCAIDE.Framework.Mission.Common.Results()
conditions.aerodynamics.angles.alpha = np.ones_like(Machs) *1E-12
conditions.aerodynamics.angles.beta = np.zeros_like(Machs)
conditions.freestream.mach_number = Machs + Machs*u_s
VLM_results = VLM(conditions,settings,vehicle)
Clift_res = VLM_results.CLift
Cdrag_res = VLM_results.CDrag_induced
CX_res = VLM_results.CX
CY_res = VLM_results.CY
CZ_res = VLM_results.CZ
CL_res = VLM_results.CL
CM_res = VLM_results.CM
CN_res = VLM_results.CN
Clift_u = np.reshape(VLM_results.CLift,(len_Mach,len_u)).T - Clift_alpha_0
Cdrag_u = np.reshape(VLM_results.CDrag_induced,(len_Mach,len_u)).T - Cdrag_alpha_0
CX_u = np.reshape(VLM_results.CX,(len_Mach,len_u)).T - CX_alpha_0
CY_u = np.reshape(VLM_results.CY,(len_Mach,len_u)).T - CY_alpha_0
CZ_u = np.reshape(VLM_results.CZ,(len_Mach,len_u)).T - CZ_alpha_0
CL_u = np.reshape(VLM_results.CL,(len_Mach,len_u)).T - CL_alpha_0
CM_u = np.reshape(VLM_results.CM,(len_Mach,len_u)).T - CM_alpha_0
CN_u = np.reshape(VLM_results.CN,(len_Mach,len_u)).T - CN_alpha_0
# -------------------------------------------------------
# Velocity v
# -------------------------------------------------------
v_s = np.atleast_2d(np.tile(v, len_Mach).T.flatten()).T
Machs = np.atleast_2d(np.repeat(Mach,len_v)).T
conditions = RCAIDE.Framework.Mission.Common.Results()
conditions.freestream.mach_number = Machs
conditions.aerodynamics.angles.alpha = np.ones_like(Machs) *1E-12
conditions.aerodynamics.angles.beta = np.zeros_like(Machs)
VLM_results = VLM(conditions,settings,vehicle)
Clift_res = VLM_results.CLift
Cdrag_res = VLM_results.CDrag_induced
CX_res = VLM_results.CX
CY_res = VLM_results.CY
CZ_res = VLM_results.CZ
CL_res = VLM_results.CL
CM_res = VLM_results.CM
CN_res = VLM_results.CN
Clift_v = np.reshape(Clift_res,(len_Mach,len_v)).T - Clift_alpha_0
Cdrag_v = np.reshape(Cdrag_res,(len_Mach,len_v)).T - Cdrag_alpha_0
CX_v = np.reshape(CX_res,(len_Mach,len_v)).T - CX_alpha_0
CY_v = np.reshape(CY_res,(len_Mach,len_v)).T - CY_alpha_0
CZ_v = np.reshape(CZ_res,(len_Mach,len_v)).T - CZ_alpha_0
CL_v = np.reshape(CL_res,(len_Mach,len_v)).T - CL_alpha_0
CM_v = np.reshape(CM_res,(len_Mach,len_v)).T - CM_alpha_0
CN_v = np.reshape(CN_res,(len_Mach,len_v)).T - CN_alpha_0
# -------------------------------------------------------
# Velocity w
# -------------------------------------------------------
w_s = np.atleast_2d(np.tile(w, len_Mach).T.flatten()).T
Machs = np.atleast_2d(np.repeat(Mach,len_w)).T
conditions = RCAIDE.Framework.Mission.Common.Results()
conditions.freestream.mach_number = Machs
conditions.aerodynamics.angles.alpha = np.ones_like(Machs) *1E-12
conditions.aerodynamics.angles.beta = np.zeros_like(Machs)
VLM_results = VLM(conditions,settings,vehicle)
Clift_res = VLM_results.CLift
Cdrag_res = VLM_results.CDrag_induced
CX_res = VLM_results.CX
CY_res = VLM_results.CY
CZ_res = VLM_results.CZ
CL_res = VLM_results.CL
CM_res = VLM_results.CM
CN_res = VLM_results.CN
Clift_w = np.reshape(Clift_res,(len_Mach,len_w)).T - Clift_alpha_0
Cdrag_w = np.reshape(Cdrag_res,(len_Mach,len_w)).T - Cdrag_alpha_0
CX_w = np.reshape(CX_res,(len_Mach,len_w)).T - CX_alpha_0
CY_w = np.reshape(CY_res,(len_Mach,len_w)).T - CY_alpha_0
CZ_w = np.reshape(CZ_res,(len_Mach,len_w)).T - CZ_alpha_0
CL_w = np.reshape(CL_res,(len_Mach,len_w)).T - CL_alpha_0
CM_w = np.reshape(CM_res,(len_Mach,len_w)).T - CM_alpha_0
CN_w = np.reshape(CN_res,(len_Mach,len_w)).T - CN_alpha_0
# -------------------------------------------------------
# Pitch Rate
# -------------------------------------------------------
q_s = np.atleast_2d(np.tile(pitch_rate, len_Mach).T.flatten()).T
Machs = np.atleast_2d(np.repeat(Mach,len_q)).T
conditions = RCAIDE.Framework.Mission.Common.Results()
conditions.freestream.mach_number = Machs
conditions.aerodynamics.angles.alpha = np.ones_like(Machs) *1E-12
conditions.aerodynamics.angles.beta = np.zeros_like(Machs)
conditions.static_stability.pitch_rate = np.ones_like(Machs)*q_s
conditions.freestream.velocity = Machs * 343 # speed of sound
VLM_results = VLM(conditions,settings,vehicle)
Clift_res = VLM_results.CLift
Cdrag_res = VLM_results.CDrag_induced
CX_res = VLM_results.CX
CY_res = VLM_results.CY
CZ_res = VLM_results.CZ
CL_res = VLM_results.CL
CM_res = VLM_results.CM
CN_res = VLM_results.CN
Clift_q = np.reshape(Clift_res,(len_Mach,len_q)).T - Clift_alpha_0
Cdrag_q = np.reshape(Cdrag_res,(len_Mach,len_q)).T - Cdrag_alpha_0
CX_q = np.reshape(CX_res,(len_Mach,len_q)).T - CX_alpha_0
CY_q = np.reshape(CY_res,(len_Mach,len_q)).T - CY_alpha_0
CZ_q = np.reshape(CZ_res,(len_Mach,len_q)).T - CZ_alpha_0
CL_q = np.reshape(CL_res,(len_Mach,len_q)).T - CL_alpha_0
CM_q = np.reshape(CM_res,(len_Mach,len_q)).T - CM_alpha_0
CN_q = np.reshape(CN_res,(len_Mach,len_q)).T - CN_alpha_0
# -------------------------------------------------------
# Roll Rate
# -------------------------------------------------------
p_s = np.atleast_2d(np.tile(roll_rate, len_Mach).T.flatten()).T
Machs = np.atleast_2d(np.repeat(Mach,len_p)).T
conditions = RCAIDE.Framework.Mission.Common.Results()
conditions.freestream.mach_number = Machs
conditions.aerodynamics.angles.alpha = np.ones_like(Machs) *1E-12
conditions.aerodynamics.angles.beta = np.zeros_like(Machs)
conditions.static_stability.roll_rate = np.ones_like(Machs)*p_s
conditions.freestream.velocity = Machs * 343 # speed of sound
VLM_results = VLM(conditions,settings,vehicle)
Clift_res = VLM_results.CLift
Cdrag_res = VLM_results.CDrag_induced
CX_res = VLM_results.CX
CY_res = VLM_results.CY
CZ_res = VLM_results.CZ
CL_res = VLM_results.CL
CM_res = VLM_results.CM
CN_res = VLM_results.CN
Clift_p = -10*(np.reshape(Clift_res,(len_Mach,len_p)).T - Clift_alpha_0)
Cdrag_p = -10*(np.reshape(Cdrag_res,(len_Mach,len_p)).T - Cdrag_alpha_0)
CX_p = -10*(np.reshape(CX_res,(len_Mach,len_p)).T - CX_alpha_0 )
CY_p = -10*(np.reshape(CY_res,(len_Mach,len_p)).T - CY_alpha_0 )
CZ_p = -10*(np.reshape(CZ_res,(len_Mach,len_p)).T - CZ_alpha_0 )
CL_p = (np.reshape(CL_res,(len_Mach,len_p)).T - CL_alpha_0 )
CM_p = -10*(np.reshape(CM_res,(len_Mach,len_p)).T - CM_alpha_0 )
CN_p = (np.reshape(CN_res,(len_Mach,len_p)).T - CN_alpha_0 )
# -------------------------------------------------------
# Yaw Rate
# -------------------------------------------------------
r_s = np.atleast_2d(np.tile(yaw_rate, len_Mach).T.flatten()).T
Machs = np.atleast_2d(np.repeat(Mach,len_r)).T
conditions = RCAIDE.Framework.Mission.Common.Results()
conditions.aerodynamics.angles.alpha = np.ones_like(Machs)*1E-2
conditions.aerodynamics.angles.beta = np.zeros_like(Machs)
conditions.freestream.mach_number = Machs
conditions.static_stability.yaw_rate = np.ones_like(Machs)*r_s
conditions.freestream.velocity = Machs * 343
VLM_results = VLM(conditions,settings,vehicle)
Clift_res = VLM_results.CLift
Cdrag_res = VLM_results.CDrag_induced
CX_res = VLM_results.CX
CY_res = VLM_results.CY
CZ_res = VLM_results.CZ
CL_res = VLM_results.CL
CM_res = VLM_results.CM
CN_res = VLM_results.CN
Clift_r = 10*(np.reshape(Clift_res,(len_Mach,len_r)).T - Clift_alpha_0)
Cdrag_r = 10*(np.reshape(Cdrag_res,(len_Mach,len_r)).T - Cdrag_alpha_0)
CX_r = 10*(np.reshape(CX_res,(len_Mach,len_r)).T - CX_alpha_0 )
CY_r = 10*(np.reshape(CY_res,(len_Mach,len_r)).T - CY_alpha_0 )
CZ_r = 10*(np.reshape(CZ_res,(len_Mach,len_r)).T - CZ_alpha_0 )
CL_r = (np.reshape(CL_res,(len_Mach,len_r)).T - CL_alpha_0 )
CM_r = 10*(np.reshape(CM_res,(len_Mach,len_r)).T - CM_alpha_0 )
CN_r = (np.reshape(CN_res,(len_Mach,len_r)).T - CN_alpha_0 )
# STABILITY COEFFICIENTS
training.Clift_alpha = Clift_alpha
training.Clift_wing_alpha = Clift_wing_alpha
training.Clift_beta = Clift_beta
training.Clift_u = Clift_u
training.Clift_v = Clift_v
training.Clift_w = Clift_w
training.Clift_p = Clift_p
training.Clift_q = Clift_q
training.Clift_r = Clift_r
training.Cdrag_alpha = Cdrag_alpha
training.Cdrag_wing_alpha = Cdrag_wing_alpha
training.Cdrag_beta = Cdrag_beta
training.Cdrag_u = Cdrag_u
training.Cdrag_v = Cdrag_v
training.Cdrag_w = Cdrag_w
training.Cdrag_p = Cdrag_p
training.Cdrag_q = Cdrag_q
training.Cdrag_r = Cdrag_r
training.CX_alpha = CX_alpha
training.CX_beta = CX_beta
training.CX_u = CX_u
training.CX_v = CX_v
training.CX_w = CX_w
training.CX_p = CX_p
training.CX_q = CX_q
training.CX_r = CX_r
training.CY_alpha = CY_alpha
training.CY_beta = CY_beta
training.CY_u = CY_u
training.CY_v = CY_v
training.CY_w = CY_w
training.CY_p = CY_p
training.CY_q = CY_q
training.CY_r = CY_r
training.CZ_alpha = CZ_alpha
training.CZ_beta = CZ_beta
training.CZ_u = CZ_u
training.CZ_v = CZ_v
training.CZ_w = CZ_w
training.CZ_p = CZ_p
training.CZ_q = CZ_q
training.CZ_r = CZ_r
training.CL_alpha = CL_alpha
training.CL_beta = CL_beta
training.CL_u = CL_u
training.CL_v = CL_v
training.CL_w = CL_w
training.CL_p = CL_p
training.CL_q = CL_q
training.CL_r = CL_r
training.CM_alpha = CM_alpha
training.CM_beta = CM_beta
training.CM_u = CM_u
training.CM_v = CM_v
training.CM_w = CM_w
training.CM_p = CM_p
training.CM_q = CM_q
training.CM_r = CM_r
training.CN_alpha = CN_alpha
training.CN_beta = CN_beta
training.CN_u = CN_u
training.CN_v = CN_v
training.CN_w = CN_w
training.CN_p = CN_p
training.CN_q = CN_q
training.CN_r = CN_r
# STABILITY DERIVATIVES
training.dClift_dalpha = (Clift_alpha[0,:] - Clift_alpha[1,:]) / (AoA[0] - AoA[1])
training.dClift_dbeta = (Clift_beta[0,:] - Clift_beta[1,:]) / (Beta[0] - Beta[1])
training.dClift_du = (Clift_u[0,:] - Clift_u[1,:]) / (u[0] - u[1])
training.dClift_dv = (Clift_v[0,:] - Clift_v[1,:]) / (v[0] - v[1])
training.dClift_dw = (Clift_w[0,:] - Clift_w[1,:]) / (w[0] - w[1])
training.dClift_dp = (Clift_p[0,:] - Clift_p[1,:]) / (roll_rate[0]-roll_rate[1])
training.dClift_dq = (Clift_q[0,:] - Clift_q[1,:]) / (pitch_rate[0]-pitch_rate[1])
training.dClift_dr = (Clift_r[0,:] - Clift_r[1,:]) / (yaw_rate[0]-yaw_rate[1])
training.dCdrag_dalpha = (Cdrag_alpha[0,:] - Cdrag_alpha[1,:]) / (AoA[0] - AoA[1])
training.dCdrag_dbeta = (Cdrag_beta[0,:] - Cdrag_beta[1,:]) / (Beta[0] - Beta[1])
training.dCdrag_du = (Cdrag_u[0,:] - Cdrag_u[1,:]) / (u[0] - u[1])
training.dCdrag_dv = (Cdrag_v[0,:] - Cdrag_v[1,:]) / (v[0] - v[1])
training.dCdrag_dw = (Cdrag_w[0,:] - Cdrag_w[1,:]) / (w[0] - w[1])
training.dCdrag_dp = (Cdrag_p[0,:] - Cdrag_p[1,:]) / (roll_rate[0]-roll_rate[1])
training.dCdrag_dq = (Cdrag_q[0,:] - Cdrag_q[1,:]) / (pitch_rate[0]-pitch_rate[1])
training.dCdrag_dr = (Cdrag_r[0,:] - Cdrag_r[1,:]) / (yaw_rate[0]-yaw_rate[1])
training.dCX_dalpha = (CX_alpha[0,:] - CX_alpha[1,:]) / (AoA[0] - AoA[1])
training.dCX_dbeta = (CX_beta[0,:] - CX_beta[1,:]) / (Beta[0] - Beta[1])
training.dCX_du = (CX_u[0,:] - CX_u[1,:]) / (u[0] - u[1])
training.dCX_dv = (CX_v[0,:] - CX_v[1,:]) / (v[0] - v[1])
training.dCX_dw = (CX_w[0,:] - CX_w[1,:]) / (w[0] - w[1])
training.dCX_dp = (CX_p[0,:] - CX_p[1,:]) / (roll_rate[0]-roll_rate[1])
training.dCX_dq = (CX_q[0,:] - CX_q[1,:]) / (pitch_rate[0]-pitch_rate[1])
training.dCX_dr = (CX_r[0,:] - CX_r[1,:]) / (yaw_rate[0]-yaw_rate[1])
training.dCY_dalpha = (CY_alpha[0,:] - CY_alpha[1,:]) / (AoA[0] - AoA[1])
training.dCY_dbeta = 2*((CY_beta[0,:] - CY_beta[1,:]) / (Beta[0] - Beta[1]))
training.dCY_du = (CY_u[0,:] - CY_u[1,:]) / (u[0] - u[1])
training.dCY_dv = (CY_v[0,:] - CY_v[1,:]) / (v[0] - v[1])
training.dCY_dw = (CY_w[0,:] - CY_w[1,:]) / (w[0] - w[1])
training.dCY_dp = (CY_p[0,:] - CY_p[1,:]) / (roll_rate[0]-roll_rate[1])
training.dCY_dq = (CY_q[0,:] - CY_q[1,:]) / (pitch_rate[0]-pitch_rate[1])
training.dCY_dr = (CY_r[0,:] - CY_r[1,:]) / (yaw_rate[0]-yaw_rate[1])
training.dCZ_dalpha = (CZ_alpha[0,:] - CZ_alpha[1,:]) / (AoA[0] - AoA[1])
training.dCZ_dbeta = (CZ_beta[0,:] - CZ_beta[1,:]) / (Beta[0] - Beta[1])
training.dCZ_du = (CZ_u[0,:] - CZ_u[1,:]) / (u[0] - u[1])
training.dCZ_dv = (CZ_v[0,:] - CZ_v[1,:]) / (v[0] - v[1])
training.dCZ_dw = (CZ_w[0,:] - CZ_w[1,:]) / (w[0] - w[1])
training.dCZ_dp = (CZ_p[0,:] - CZ_p[1,:]) / (roll_rate[0]-roll_rate[1])
training.dCZ_dq = (CZ_q[0,:] - CZ_q[1,:]) / (pitch_rate[0]-pitch_rate[1])
training.dCZ_dr = (CZ_r[0,:] - CZ_r[1,:]) / (yaw_rate[0]-yaw_rate[1])
training.dCL_dalpha = (CL_alpha[0,:] - CL_alpha[1,:]) / (AoA[0] - AoA[1])
training.dCL_dbeta = ((CL_beta[0,:] - CL_beta[1,:]) / (Beta[0] - Beta[1]))
training.dCL_du = (CL_u[0,:] - CL_u[1,:]) / (u[0] - u[1])
training.dCL_dv = (CL_v[0,:] - CL_v[1,:]) / (v[0] - v[1])
training.dCL_dw = (CL_w[0,:] - CL_w[1,:]) / (w[0] - w[1])
training.dCL_dp = -2*((CL_p[0,:] - CL_p[1,:]) / (roll_rate[0]-roll_rate[1]))
training.dCL_dq = (CL_q[0,:] - CL_q[1,:]) / (pitch_rate[0]-pitch_rate[1])
training.dCL_dr = (CL_r[0,:] - CL_r[1,:]) / (yaw_rate[0]-yaw_rate[1])
training.dCM_dalpha = (CM_alpha[0,:] - CM_alpha[1,:]) / (AoA[0] - AoA[1])
training.dCM_dbeta = (CM_beta[0,:] - CM_beta[1,:]) / (Beta[0] - Beta[1])
training.dCM_du = (CM_u[0,:] - CM_u[1,:]) / (u[0] - u[1])
training.dCM_dv = (CM_v[0,:] - CM_v[1,:]) / (v[0] - v[1])
training.dCM_dw = (CM_w[0,:] - CM_w[1,:]) / (w[0] - w[1])
training.dCM_dp = (CM_p[0,:] - CM_p[1,:]) / (roll_rate[0]-roll_rate[1])
training.dCM_dq = 10*((CM_q[0,:] - CM_q[1,:]) / (pitch_rate[0]-pitch_rate[1]))
training.dCM_dr = (CM_r[0,:] - CM_r[1,:]) / (yaw_rate[0]-yaw_rate[1])
training.dCN_dalpha = (CN_alpha[0,:] - CN_alpha[1,:]) / (AoA[0] - AoA[1])
training.dCN_dbeta = (CN_beta[0,:] - CN_beta[1,:]) / (Beta[0] - Beta[1])
training.dCN_du = (CN_u[0,:] - CN_u[1,:]) / (u[0] - u[1])
training.dCN_dv = (CN_v[0,:] - CN_v[1,:]) / (v[0] - v[1])
training.dCN_dw = (CN_w[0,:] - CN_w[1,:]) / (w[0] - w[1])
training.dCN_dp = -3*((CN_p[0,:] - CN_p[1,:]) / (roll_rate[0]-roll_rate[1]))
training.dCN_dq = (CN_q[0,:] - CN_q[1,:]) / (pitch_rate[0]-pitch_rate[1])
training.dCN_dr = 3*((CN_r[0,:] - CN_r[1,:]) / (yaw_rate[0]-yaw_rate[1]))
''' for control surfaces, subtract inflence WITHOUT control surface deflected from coefficients WITH control surfaces'''
for wing in vehicle.wings:
for control_surface in wing.control_surfaces:
# --------------------------------------------------------------------------------------------------------------
# Aileron
# --------------------------------------------------------------------------------------------------------------
if type(control_surface) == RCAIDE.Library.Components.Wings.Control_Surfaces.Aileron:
Clift_d_a = np.zeros((len_d_a,len_Mach))
Cdrag_d_a = np.zeros((len_d_a,len_Mach))
CX_d_a = np.zeros((len_d_a,len_Mach))
CY_d_a = np.zeros((len_d_a,len_Mach))
CZ_d_a = np.zeros((len_d_a,len_Mach))
CL_d_a = np.zeros((len_d_a,len_Mach))
CM_d_a = np.zeros((len_d_a,len_Mach))
CN_d_a = np.zeros((len_d_a,len_Mach))
for a_i in range(len_d_a):
Machs = np.atleast_2d(np.repeat(Mach,1)).T
conditions = RCAIDE.Framework.Mission.Common.Results()
conditions.aerodynamics.angles.alpha = np.ones_like(Machs) *1E-12
conditions.aerodynamics.angles.beta = np.zeros_like(Machs)
conditions.freestream.mach_number = Machs
vehicle.wings[wing.tag].control_surfaces.aileron.deflection = delta_a[a_i]
VLM_results = VLM(conditions,settings,vehicle)
Clift_res = VLM_results.CLift
Cdrag_res = VLM_results.CDrag_induced
CX_res = VLM_results.CX
CY_res = VLM_results.CY
CZ_res = VLM_results.CZ
CL_res = VLM_results.CL
CM_res = VLM_results.CM
CN_res = VLM_results.CN
vehicle.wings[wing.tag].control_surfaces.aileron.deflection = 0
Clift_d_a[a_i,:] = -(Clift_res[:,0] - Clift_alpha_0[0,:])
Cdrag_d_a[a_i,:] = -(Cdrag_res[:,0] - Cdrag_alpha_0[0,:])
CX_d_a[a_i,:] = -(CX_res[:,0] - CX_alpha_0[0,:] )
CY_d_a[a_i,:] = -(CY_res[:,0] - CY_alpha_0[0,:] )
CZ_d_a[a_i,:] = -(CZ_res[:,0] - CZ_alpha_0[0,:] )
CL_d_a[a_i,:] = -(CL_res[:,0] - CL_alpha_0[0,:])
CM_d_a[a_i,:] = -(CM_res[:,0] - CM_alpha_0[0,:] )
CN_d_a[a_i,:] = (CN_res[:,0] - CN_alpha_0[0,:] )
training.Clift_delta_a = Clift_d_a
training.Cdrag_delta_a = Cdrag_d_a
training.CX_delta_a = CX_d_a
training.CY_delta_a = CY_d_a
training.CZ_delta_a = CZ_d_a
training.CL_delta_a = CL_d_a
training.CM_delta_a = CM_d_a
training.CN_delta_a = CN_d_a
training.dClift_ddelta_a = (Clift_d_a[0,:] - Clift_d_a[1,:]) / (delta_a[0] - delta_a[1])
training.dCdrag_ddelta_a = (Cdrag_d_a[0,:] - Cdrag_d_a[1,:]) / (delta_a[0] - delta_a[1])
training.dCX_ddelta_a = (CX_d_a[0,:] - CX_d_a[1,:]) / (delta_a[0] - delta_a[1])
training.dCY_ddelta_a = (CY_d_a[0,:] - CY_d_a[1,:]) / (delta_a[0] - delta_a[1])
training.dCZ_ddelta_a = (CZ_d_a[0,:] - CZ_d_a[1,:]) / (delta_a[0] - delta_a[1])
training.dCL_ddelta_a = ((CL_d_a[0,:] - CL_d_a[1,:]) / (delta_a[0] - delta_a[1]))
training.dCM_ddelta_a = (CM_d_a[0,:] - CM_d_a[1,:]) / (delta_a[0] - delta_a[1])
training.dCN_ddelta_a = (CN_d_a[0,:] - CN_d_a[1,:]) / (delta_a[0] - delta_a[1])
# --------------------------------------------------------------------------------------------------------------
# Elevator
# --------------------------------------------------------------------------------------------------------------
if type(control_surface) == RCAIDE.Library.Components.Wings.Control_Surfaces.Elevator:
Clift_d_e = np.zeros((len_d_e,len_Mach))
Cdrag_d_e = np.zeros((len_d_e,len_Mach))
CX_d_e = np.zeros((len_d_e,len_Mach))
CY_d_e = np.zeros((len_d_e,len_Mach))
CZ_d_e = np.zeros((len_d_e,len_Mach))
CL_d_e = np.zeros((len_d_e,len_Mach))
CM_d_e = np.zeros((len_d_e,len_Mach))
CN_d_e = np.zeros((len_d_e,len_Mach))
for e_i in range(len_d_e):
Machs = np.atleast_2d(np.repeat(Mach,1)).T
conditions = RCAIDE.Framework.Mission.Common.Results()
conditions.aerodynamics.angles.alpha = np.ones_like(Machs) *1E-12
conditions.aerodynamics.angles.beta = np.zeros_like(Machs)
conditions.freestream.mach_number = Machs
vehicle.wings[wing.tag].control_surfaces.elevator.deflection = delta_e[e_i]
VLM_results = VLM(conditions,settings,vehicle)
Clift_res = VLM_results.CLift
Cdrag_res = VLM_results.CDrag_induced
CX_res = VLM_results.CX
CY_res = VLM_results.CY
CZ_res = VLM_results.CZ
CL_res = VLM_results.CL
CM_res = VLM_results.CM
CN_res = VLM_results.CN
vehicle.wings[wing.tag].control_surfaces.elevator.deflection = 0
Clift_d_e[e_i,:] = Clift_res[:,0] - Clift_alpha_0[0,:]
Cdrag_d_e[e_i,:] = Cdrag_res[:,0] - Cdrag_alpha_0[0,:]
CX_d_e[e_i,:] = CX_res[:,0] - CX_alpha_0[0,:]
CY_d_e[e_i,:] = CY_res[:,0] - CY_alpha_0[0,:]
CZ_d_e[e_i,:] = CZ_res[:,0] - CZ_alpha_0[0,:]
CL_d_e[e_i,:] = CL_res[:,0] - CL_alpha_0[0,:]
CM_d_e[e_i,:] = CM_res[:,0] - CM_alpha_0[0,:]
CN_d_e[e_i,:] = CN_res[:,0] - CN_alpha_0[0,:]
training.Clift_delta_e = Clift_d_e
training.Cdrag_delta_e = Cdrag_d_e
training.CX_delta_e = CX_d_e
training.CY_delta_e = CY_d_e
training.CZ_delta_e = CZ_d_e
training.CL_delta_e = CL_d_e
training.CM_delta_e = CM_d_e
training.CN_delta_e = CN_d_e
training.dClift_ddelta_e = 0.5*((Clift_d_e[0,:] - Clift_d_e[1,:]) / (delta_e[0] - delta_e[1]))
training.dCdrag_ddelta_e = (Cdrag_d_e[0,:] - Cdrag_d_e[1,:]) / (delta_e[0] - delta_e[1])
training.dCX_ddelta_e = (CX_d_e[0,:] - CX_d_e[1,:]) / (delta_e[0] - delta_e[1])
training.dCY_ddelta_e = (CY_d_e[0,:] - CY_d_e[1,:]) / (delta_e[0] - delta_e[1])
training.dCZ_ddelta_e = (CZ_d_e[0,:] - CZ_d_e[1,:]) / (delta_e[0] - delta_e[1])
training.dCL_ddelta_e = (CL_d_e[0,:] - CL_d_e[1,:]) / (delta_e[0] - delta_e[1])
training.dCM_ddelta_e = (CM_d_e[0,:] - CM_d_e[1,:]) / (delta_e[0] - delta_e[1])
training.dCN_ddelta_e = (CN_d_e[0,:] - CN_d_e[1,:]) / (delta_e[0] - delta_e[1])
# --------------------------------------------------------------------------------------------------------------
# Rudder
# --------------------------------------------------------------------------------------------------------------
if type(control_surface) == RCAIDE.Library.Components.Wings.Control_Surfaces.Rudder:
Clift_d_r = np.zeros((len_d_r,len_Mach))
Cdrag_d_r = np.zeros((len_d_r,len_Mach))
CX_d_r = np.zeros((len_d_r,len_Mach))
CY_d_r = np.zeros((len_d_r,len_Mach))
CZ_d_r = np.zeros((len_d_r,len_Mach))
CL_d_r = np.zeros((len_d_r,len_Mach))
CM_d_r = np.zeros((len_d_r,len_Mach))
CN_d_r = np.zeros((len_d_r,len_Mach))
for r_i in range(len_d_r):
Machs = np.atleast_2d(np.repeat(Mach,1)).T
conditions = RCAIDE.Framework.Mission.Common.Results()
conditions.aerodynamics.angles.alpha = np.ones_like(Machs) *1E-12
conditions.aerodynamics.angles.beta = np.zeros_like(Machs)
conditions.freestream.mach_number = Machs
vehicle.wings[wing.tag].control_surfaces.rudder.deflection = delta_r[r_i]
VLM_results = VLM(conditions,settings,vehicle)
Clift_res = VLM_results.CLift
Cdrag_res = VLM_results.CDrag_induced
CX_res = VLM_results.CX
CY_res = VLM_results.CY
CZ_res = VLM_results.CZ
CL_res = VLM_results.CL
CM_res = VLM_results.CM
CN_res = VLM_results.CN
vehicle.wings[wing.tag].control_surfaces.rudder.deflection = 0
Clift_d_r[r_i,:] = -(Clift_res[:,0] - Clift_alpha_0[0,:])
Cdrag_d_r[r_i,:] = -(Cdrag_res[:,0] - Cdrag_alpha_0[0,:])
CX_d_r[r_i,:] = -(CX_res[:,0] - CX_alpha_0[0,:] )
CY_d_r[r_i,:] = -(CY_res[:,0] - CY_alpha_0[0,:] )
CZ_d_r[r_i,:] = -(CZ_res[:,0] - CZ_alpha_0[0,:] )
CL_d_r[r_i,:] = -(CL_res[:,0] - CL_alpha_0[0,:] )
CM_d_r[r_i,:] = -(CM_res[:,0] - CM_alpha_0[0,:] )
CN_d_r[r_i,:] = (CN_res[:,0] - CN_alpha_0[0,:] )
training.Clift_delta_r = Clift_d_r
training.Cdrag_delta_r = Cdrag_d_r
training.CX_delta_r = CX_d_r
training.CY_delta_r = CY_d_r
training.CZ_delta_r = CZ_d_r
training.CL_delta_r = CL_d_r
training.CM_delta_r = CM_d_r
training.CN_delta_r = CN_d_r
training.dClift_ddelta_r = (Clift_d_r[0,:] - Clift_d_r[1,:]) / (delta_r[0] - delta_r[1])
training.dCdrag_ddelta_r = (Cdrag_d_r[0,:] - Cdrag_d_r[1,:]) / (delta_r[0] - delta_r[1])
training.dCX_ddelta_r = (CX_d_r[0,:] - CX_d_r[1,:]) / (delta_r[0] - delta_r[1])
training.dCY_ddelta_r = (CY_d_r[0,:] - CY_d_r[1,:]) / (delta_r[0] - delta_r[1])
training.dCZ_ddelta_r = (CZ_d_r[0,:] - CZ_d_r[1,:]) / (delta_r[0] - delta_r[1])
training.dCL_ddelta_r = (CL_d_r[0,:] - CL_d_r[1,:]) / (delta_r[0] - delta_r[1])
training.dCM_ddelta_r = (CM_d_r[0,:] - CM_d_r[1,:]) / (delta_r[0] - delta_r[1])
training.dCN_ddelta_r = (CN_d_r[0,:] - CN_d_r[1,:]) / (delta_r[0] - delta_r[1])
# --------------------------------------------------------------------------------------------------------------
# Flap
# --------------------------------------------------------------------------------------------------------------
if type(control_surface) == RCAIDE.Library.Components.Wings.Control_Surfaces.Flap:
Clift_d_f = np.zeros((len_d_f,len_Mach))
Cdrag_d_f = np.zeros((len_d_f,len_Mach))
CX_d_f = np.zeros((len_d_f,len_Mach))
CY_d_f = np.zeros((len_d_f,len_Mach))
CZ_d_f = np.zeros((len_d_f,len_Mach))
CL_d_f = np.zeros((len_d_f,len_Mach))
CM_d_f = np.zeros((len_d_f,len_Mach))
CN_d_f = np.zeros((len_d_f,len_Mach))
for f_i in range(len_d_f):
Machs = np.atleast_2d(np.repeat(Mach,1)).T
conditions = RCAIDE.Framework.Mission.Common.Results()
conditions.aerodynamics.angles.alpha = np.ones_like(Machs) *1E-12
conditions.aerodynamics.angles.beta = np.zeros_like(Machs)
conditions.freestream.mach_number = Machs
vehicle.wings[wing.tag].control_surfaces.flap.deflection = delta_f[f_i]
VLM_results = VLM(conditions,settings,vehicle)
Clift_res = VLM_results.CLift
Cdrag_res = VLM_results.CDrag_induced
CX_res = VLM_results.CX
CY_res = VLM_results.CY
CZ_res = VLM_results.CZ
CL_res = VLM_results.CL
CM_res = VLM_results.CM
CN_res = VLM_results.CN
vehicle.wings[wing.tag].control_surfaces.flap.deflection = 0
Clift_d_f[f_i,:] = Clift_res[:,0] - Clift_alpha_0[0,:]
Cdrag_d_f[f_i,:] = Cdrag_res[:,0] - Cdrag_alpha_0[0,:]
CX_d_f[f_i,:] = CX_res[:,0] - CX_alpha_0[0,:]
CY_d_f[f_i,:] = CY_res[:,0] - CY_alpha_0[0,:]
CZ_d_f[f_i,:] = CZ_res[:,0] - CZ_alpha_0[0,:]
CL_d_f[f_i,:] = CL_res[:,0] - CL_alpha_0[0,:]
CM_d_f[f_i,:] = CM_res[:,0] - CM_alpha_0[0,:]
CN_d_f[f_i,:] = CN_res[:,0] - CN_alpha_0[0,:]
training.Clift_delta_f = Clift_d_f
training.Cdrag_delta_f = Cdrag_d_f
training.CX_delta_f = CX_d_f
training.CY_delta_f = CY_d_f
training.CZ_delta_f = CZ_d_f
training.CL_delta_f = CL_d_f
training.CM_delta_f = CM_d_f
training.CN_delta_f = CN_d_f
training.dClift_ddelta_f = (Clift_d_f[0,:] - Clift_d_f[1,:]) / (delta_f[0] - delta_f[1])
training.dCdrag_ddelta_f = (Cdrag_d_f[0,:] - Cdrag_d_f[1,:]) / (delta_f[0] - delta_f[1])
training.dCX_ddelta_f = (CX_d_f[0,:] - CX_d_f[1,:]) / (delta_f[0] - delta_f[1])
training.dCY_ddelta_f = (CY_d_f[0,:] - CY_d_f[1,:]) / (delta_f[0] - delta_f[1])
training.dCZ_ddelta_f = (CZ_d_f[0,:] - CZ_d_f[1,:]) / (delta_f[0] - delta_f[1])
training.dCL_ddelta_f = (CL_d_f[0,:] - CL_d_f[1,:]) / (delta_f[0] - delta_f[1])
training.dCM_ddelta_f = (CM_d_f[0,:] - CM_d_f[1,:]) / (delta_f[0] - delta_f[1])
training.dCN_ddelta_f = (CN_d_f[0,:] - CN_d_f[1,:]) / (delta_f[0] - delta_f[1])
# --------------------------------------------------------------------------------------------------------------
# Slat
# --------------------------------------------------------------------------------------------------------------
if type(control_surface) == RCAIDE.Library.Components.Wings.Control_Surfaces.Slat:
Clift_d_s = np.zeros((len_d_s,len_Mach))
Cdrag_d_s = np.zeros((len_d_s,len_Mach))
CX_d_s = np.zeros((len_d_s,len_Mach))
CY_d_s = np.zeros((len_d_s,len_Mach))
CZ_d_s = np.zeros((len_d_s,len_Mach))
CL_d_s = np.zeros((len_d_s,len_Mach))
CM_d_s = np.zeros((len_d_s,len_Mach))
CN_d_s = np.zeros((len_d_s,len_Mach))
for s_i in range(len_d_s):
Machs = np.atleast_2d(np.repeat(Mach,1)).T
conditions = RCAIDE.Framework.Mission.Common.Results()
conditions.aerodynamics.angles.alpha = np.ones_like(Machs) *1E-12
conditions.aerodynamics.angles.beta = np.zeros_like(Machs)
conditions.freestream.mach_number = Machs
vehicle.wings[wing.tag].control_surfaces.slat.deflection = delta_s[s_i]
VLM_results = VLM(conditions,settings,vehicle)
Clift_res = VLM_results.CLift
Cdrag_res = VLM_results.CDrag_induced
CX_res = VLM_results.CX
CY_res = VLM_results.CY
CZ_res = VLM_results.CZ
CL_res = VLM_results.CL
CM_res = VLM_results.CM
CN_res = VLM_results.CN
vehicle.wings[wing.tag].control_surfaces.slat.deflection = 0
Clift_d_s[s_i,:] = Clift_res[:,0] - Clift_alpha_0[0,:]
Cdrag_d_s[s_i,:] = Cdrag_res[:,0] - Cdrag_alpha_0[0,:]
CX_d_s[s_i,:] = CX_res[:,0] - CX_alpha_0[0,:]
CY_d_s[s_i,:] = CY_res[:,0] - CY_alpha_0[0,:]
CZ_d_s[s_i,:] = CZ_res[:,0] - CZ_alpha_0[0,:]
CL_d_s[s_i,:] = CL_res[:,0] - CL_alpha_0[0,:]
CM_d_s[s_i,:] = CM_res[:,0] - CM_alpha_0[0,:]
CN_d_s[s_i,:] = CN_res[:,0] - CN_alpha_0[0,:]
training.Clift_delta_s = Clift_d_s
training.Cdrag_delta_s = Cdrag_d_s
training.CX_delta_s = CX_d_s
training.CY_delta_s = CY_d_s
training.CZ_delta_s = CZ_d_s
training.CL_delta_s = CL_d_s
training.CM_delta_s = CM_d_s
training.CN_delta_s = CN_d_s
training.dClift_ddelta_s = (Clift_d_s[0,:] - Clift_d_s[1,:]) / (delta_s[0] - delta_s[1])
training.dCdrag_ddelta_s = (Cdrag_d_s[0,:] - Cdrag_d_s[1,:]) / (delta_s[0] - delta_s[1])
training.dCX_ddelta_s = (CX_d_s[0,:] - CX_d_s[1,:]) / (delta_s[0] - delta_s[1])
training.dCY_ddelta_s = (CY_d_s[0,:] - CY_d_s[1,:]) / (delta_s[0] - delta_s[1])
training.dCZ_ddelta_s = (CZ_d_s[0,:] - CZ_d_s[1,:]) / (delta_s[0] - delta_s[1])
training.dCL_ddelta_s = (CL_d_s[0,:] - CL_d_s[1,:]) / (delta_s[0] - delta_s[1])
training.dCM_ddelta_s = (CM_d_s[0,:] - CM_d_s[1,:]) / (delta_s[0] - delta_s[1])
training.dCN_ddelta_s = (CN_d_s[0,:] - CN_d_s[1,:]) / (delta_s[0] - delta_s[1])
training.NP = 0
return training
[docs]
def train_trasonic_model(aerodynamics, training_subsonic,training_supersonic,sub_Mach, sup_Mach):
"""Sub function that call methods to run VLM for sample point evaluation.
Assumptions:
None
Source:
None
Args:
aerodynamics : VLM analysis [unitless]
Returns:
None
"""
vehicle = deepcopy(aerodynamics.vehicle)
AoA = aerodynamics.training.angle_of_attack
Beta = aerodynamics.training.sideslip_angle
training = Data()
training.Mach = np.array([sub_Mach[-1], sup_Mach[0]])
u = aerodynamics.training.u
v = aerodynamics.training.v
w = aerodynamics.training.w
pitch_rate = aerodynamics.training.pitch_rate
roll_rate = aerodynamics.training.roll_rate
yaw_rate = aerodynamics.training.yaw_rate
# --------------------------------------------------------------------------------------------------------------
# Alpha
# --------------------------------------------------------------------------------------------------------------
Clift_alpha = np.concatenate((training_subsonic.Clift_alpha[:,-1][:,None] , training_supersonic.Clift_alpha[:,0][:,None] ), axis = 1)
Cdrag_alpha = np.concatenate((training_subsonic.Cdrag_alpha[:,-1][:,None] , training_supersonic.Cdrag_alpha[:,0][:,None] ), axis = 1)
CX_alpha = np.concatenate((training_subsonic.CX_alpha[:,-1][:,None] , training_supersonic.CX_alpha[:,0][:,None] ), axis = 1)
CY_alpha = np.concatenate((training_subsonic.CY_alpha[:,-1][:,None] , training_supersonic.CY_alpha[:,0][:,None] ), axis = 1)
CZ_alpha = np.concatenate((training_subsonic.CZ_alpha[:,-1][:,None] , training_supersonic.CZ_alpha[:,0][:,None] ), axis = 1)
CL_alpha = np.concatenate((training_subsonic.CL_alpha[:,-1][:,None] , training_supersonic.CL_alpha[:,0][:,None] ), axis = 1)
CM_alpha = np.concatenate((training_subsonic.CM_alpha[:,-1][:,None] , training_supersonic.CM_alpha[:,0][:,None] ), axis = 1)
CN_alpha = np.concatenate((training_subsonic.CN_alpha[:,-1][:,None] , training_supersonic.CN_alpha[:,0][:,None] ), axis = 1)
Clift_wing_alpha = Data()
Cdrag_wing_alpha = Data()
for wing in vehicle.wings:
Clift_wing_alpha[wing.tag] = np.concatenate((training_subsonic.Clift_wing_alpha[wing.tag][:,-1][:,None] , training_supersonic.Clift_wing_alpha[wing.tag][:,0][:,None] ), axis = 1)
Cdrag_wing_alpha[wing.tag] = np.concatenate((training_subsonic.Cdrag_wing_alpha[wing.tag][:,-1][:,None] , training_supersonic.Cdrag_wing_alpha[wing.tag][:,0][:,None] ), axis = 1)
# --------------------------------------------------------------------------------------------------------------
# Beta
# --------------------------------------------------------------------------------------------------------------
Clift_beta = np.concatenate((training_subsonic.Clift_beta[:,-1][:,None] , training_supersonic.Clift_beta[:,0][:,None] ), axis = 1)
Cdrag_beta = np.concatenate((training_subsonic.Cdrag_beta[:,-1][:,None] , training_supersonic.Cdrag_beta[:,0][:,None] ), axis = 1)
CX_beta = np.concatenate((training_subsonic.CX_beta[:,-1][:,None] , training_supersonic.CX_beta[:,0][:,None] ), axis = 1)
CY_beta = np.concatenate((training_subsonic.CY_beta[:,-1][:,None] , training_supersonic.CY_beta[:,0][:,None] ), axis = 1)
CZ_beta = np.concatenate((training_subsonic.CZ_beta[:,-1][:,None] , training_supersonic.CZ_beta[:,0][:,None] ), axis = 1)
CL_beta = np.concatenate((training_subsonic.CL_beta[:,-1][:,None] , training_supersonic.CL_beta[:,0][:,None] ), axis = 1)
CM_beta = np.concatenate((training_subsonic.CM_beta[:,-1][:,None] , training_supersonic.CM_beta[:,0][:,None] ), axis = 1)
CN_beta = np.concatenate((training_subsonic.CN_beta[:,-1][:,None] , training_supersonic.CN_beta[:,0][:,None] ), axis = 1)
# -------------------------------------------------------
# Velocity u
# -------------------------------------------------------
Clift_u = np.concatenate((training_subsonic.Clift_u[:,-1][:,None] , training_supersonic.Clift_u[:,0][:,None] ), axis = 1)
Cdrag_u = np.concatenate((training_subsonic.Cdrag_u[:,-1][:,None] , training_supersonic.Cdrag_u[:,0][:,None] ), axis = 1)
CX_u = np.concatenate((training_subsonic.CX_u[:,-1][:,None] , training_supersonic.CX_u[:,0][:,None] ), axis = 1)
CY_u = np.concatenate((training_subsonic.CY_u[:,-1][:,None] , training_supersonic.CY_u[:,0][:,None] ), axis = 1)
CZ_u = np.concatenate((training_subsonic.CZ_u[:,-1][:,None] , training_supersonic.CZ_u[:,0][:,None] ), axis = 1)
CL_u = np.concatenate((training_subsonic.CL_u[:,-1][:,None] , training_supersonic.CL_u[:,0][:,None] ), axis = 1)
CM_u = np.concatenate((training_subsonic.CM_u[:,-1][:,None] , training_supersonic.CM_u[:,0][:,None] ), axis = 1)
CN_u = np.concatenate((training_subsonic.CN_u[:,-1][:,None] , training_supersonic.CN_u[:,0][:,None] ), axis = 1)
# -------------------------------------------------------
# Velocity v
# -------------------------------------------------------
Clift_v = np.concatenate((training_subsonic.Clift_v[:,-1][:,None] , training_supersonic.Clift_v[:,0][:,None] ), axis = 1)
Cdrag_v = np.concatenate((training_subsonic.Cdrag_v[:,-1][:,None] , training_supersonic.Cdrag_v[:,0][:,None] ), axis = 1)
CX_v = np.concatenate((training_subsonic.CX_v[:,-1][:,None] , training_supersonic.CX_v[:,0][:,None] ), axis = 1)
CY_v = np.concatenate((training_subsonic.CY_v[:,-1][:,None] , training_supersonic.CY_v[:,0][:,None] ), axis = 1)
CZ_v = np.concatenate((training_subsonic.CZ_v[:,-1][:,None] , training_supersonic.CZ_v[:,0][:,None] ), axis = 1)
CL_v = np.concatenate((training_subsonic.CL_v[:,-1][:,None] , training_supersonic.CL_v[:,0][:,None] ), axis = 1)
CM_v = np.concatenate((training_subsonic.CM_v[:,-1][:,None] , training_supersonic.CM_v[:,0][:,None] ), axis = 1)
CN_v = np.concatenate((training_subsonic.CN_v[:,-1][:,None] , training_supersonic.CN_v[:,0][:,None] ), axis = 1)
# -------------------------------------------------------
# Velocity w
# -------------------------------------------------------
Clift_w = np.concatenate((training_subsonic.Clift_w[:,-1][:,None] , training_supersonic.Clift_w[:,0][:,None] ), axis = 1)
Cdrag_w = np.concatenate((training_subsonic.Cdrag_w[:,-1][:,None] , training_supersonic.Cdrag_w[:,0][:,None] ), axis = 1)
CX_w = np.concatenate((training_subsonic.CX_w[:,-1][:,None] , training_supersonic.CX_w[:,0][:,None] ), axis = 1)
CY_w = np.concatenate((training_subsonic.CY_w[:,-1][:,None] , training_supersonic.CY_w[:,0][:,None] ), axis = 1)
CZ_w = np.concatenate((training_subsonic.CZ_w[:,-1][:,None] , training_supersonic.CZ_w[:,0][:,None] ), axis = 1)
CL_w = np.concatenate((training_subsonic.CL_w[:,-1][:,None] , training_supersonic.CL_w[:,0][:,None] ), axis = 1)
CM_w = np.concatenate((training_subsonic.CM_w[:,-1][:,None] , training_supersonic.CM_w[:,0][:,None] ), axis = 1)
CN_w = np.concatenate((training_subsonic.CN_w[:,-1][:,None] , training_supersonic.CN_w[:,0][:,None] ), axis = 1)
# -------------------------------------------------------
# Pitch Rate
# -------------------------------------------------------
Clift_q = np.concatenate((training_subsonic.Clift_q[:,-1][:,None] , training_supersonic.Clift_q[:,0][:,None] ), axis = 1)
Cdrag_q = np.concatenate((training_subsonic.Cdrag_q[:,-1][:,None] , training_supersonic.Cdrag_q[:,0][:,None] ), axis = 1)
CX_q = np.concatenate((training_subsonic.CX_q[:,-1][:,None] , training_supersonic.CX_q[:,0][:,None] ), axis = 1)
CY_q = np.concatenate((training_subsonic.CY_q[:,-1][:,None] , training_supersonic.CY_q[:,0][:,None] ), axis = 1)
CZ_q = np.concatenate((training_subsonic.CZ_q[:,-1][:,None] , training_supersonic.CZ_q[:,0][:,None] ), axis = 1)
CL_q = np.concatenate((training_subsonic.CL_q[:,-1][:,None] , training_supersonic.CL_q[:,0][:,None] ), axis = 1)
CM_q = np.concatenate((training_subsonic.CM_q[:,-1][:,None] , training_supersonic.CM_q[:,0][:,None] ), axis = 1)
CN_q = np.concatenate((training_subsonic.CN_q[:,-1][:,None] , training_supersonic.CN_q[:,0][:,None] ), axis = 1)
# -------------------------------------------------------
# Roll Rate
# -------------------------------------------------------
Clift_p = np.concatenate((training_subsonic.Clift_p[:,-1][:,None] , training_supersonic.Clift_p[:,0][:,None] ), axis = 1)
Cdrag_p = np.concatenate((training_subsonic.Cdrag_p[:,-1][:,None] , training_supersonic.Cdrag_p[:,0][:,None] ), axis = 1)
CX_p = np.concatenate((training_subsonic.CX_p[:,-1][:,None] , training_supersonic.CX_p[:,0][:,None] ), axis = 1)
CY_p = np.concatenate((training_subsonic.CY_p[:,-1][:,None] , training_supersonic.CY_p[:,0][:,None] ), axis = 1)
CZ_p = np.concatenate((training_subsonic.CZ_p[:,-1][:,None] , training_supersonic.CZ_p[:,0][:,None] ), axis = 1)
CL_p = np.concatenate((training_subsonic.CL_p[:,-1][:,None] , training_supersonic.CL_p[:,0][:,None] ), axis = 1)
CM_p = np.concatenate((training_subsonic.CM_p[:,-1][:,None] , training_supersonic.CM_p[:,0][:,None] ), axis = 1)
CN_p = np.concatenate((training_subsonic.CN_p[:,-1][:,None] , training_supersonic.CN_p[:,0][:,None] ), axis = 1)
# -------------------------------------------------------
# Yaw Rate
# -------------------------------------------------------
Clift_r = np.concatenate((training_subsonic.Clift_r[:,-1][:,None] , training_supersonic.Clift_r[:,0][:,None] ), axis = 1)
Cdrag_r = np.concatenate((training_subsonic.Cdrag_r[:,-1][:,None] , training_supersonic.Cdrag_r[:,0][:,None] ), axis = 1)
CX_r = np.concatenate((training_subsonic.CX_r[:,-1][:,None] , training_supersonic.CX_r[:,0][:,None] ), axis = 1)
CY_r = np.concatenate((training_subsonic.CY_r[:,-1][:,None] , training_supersonic.CY_r[:,0][:,None] ), axis = 1)
CZ_r = np.concatenate((training_subsonic.CZ_r[:,-1][:,None] , training_supersonic.CZ_r[:,0][:,None] ), axis = 1)
CL_r = np.concatenate((training_subsonic.CL_r[:,-1][:,None] , training_supersonic.CL_r[:,0][:,None] ), axis = 1)
CM_r = np.concatenate((training_subsonic.CM_r[:,-1][:,None] , training_supersonic.CM_r[:,0][:,None] ), axis = 1)
CN_r = np.concatenate((training_subsonic.CN_r[:,-1][:,None] , training_supersonic.CN_r[:,0][:,None] ), axis = 1)
# STABILITY COEFFICIENTS
training.Clift_wing_alpha = Clift_wing_alpha
training.Clift_alpha = Clift_alpha
training.Clift_beta = Clift_beta
training.Clift_u = Clift_u
training.Clift_v = Clift_v
training.Clift_w = Clift_w
training.Clift_p = Clift_p
training.Clift_q = Clift_q
training.Clift_r = Clift_r
training.Cdrag_alpha = Cdrag_alpha
training.Cdrag_wing_alpha = Cdrag_wing_alpha
training.Cdrag_beta = Cdrag_beta
training.Cdrag_u = Cdrag_u
training.Cdrag_v = Cdrag_v
training.Cdrag_w = Cdrag_w
training.Cdrag_p = Cdrag_p
training.Cdrag_q = Cdrag_q
training.Cdrag_r = Cdrag_r
training.CX_alpha = CX_alpha
training.CX_beta = CX_beta
training.CX_u = CX_u
training.CX_v = CX_v
training.CX_w = CX_w
training.CX_p = CX_p
training.CX_q = CX_q
training.CX_r = CX_r
training.CY_alpha = CY_alpha
training.CY_beta = CY_beta
training.CY_u = CY_u
training.CY_v = CY_v
training.CY_w = CY_w
training.CY_p = CY_p
training.CY_q = CY_q
training.CY_r = CY_r
training.CZ_alpha = CZ_alpha
training.CZ_beta = CZ_beta
training.CZ_u = CZ_u
training.CZ_v = CZ_v
training.CZ_w = CZ_w
training.CZ_p = CZ_p
training.CZ_q = CZ_q
training.CZ_r = CZ_r
training.CL_alpha = CL_alpha
training.CL_beta = CL_beta
training.CL_u = CL_u
training.CL_v = CL_v
training.CL_w = CL_w
training.CL_p = CL_p
training.CL_q = CL_q
training.CL_r = CL_r
training.CM_alpha = CM_alpha
training.CM_beta = CM_beta
training.CM_u = CM_u
training.CM_v = CM_v
training.CM_w = CM_w
training.CM_p = CM_p
training.CM_q = CM_q
training.CM_r = CM_r
training.CN_alpha = CN_alpha
training.CN_beta = CN_beta
training.CN_u = CN_u
training.CN_v = CN_v
training.CN_w = CN_w
training.CN_p = CN_p
training.CN_q = CN_q
training.CN_r = CN_r
# STABILITY DERIVATIVES
training.dClift_dalpha = (Clift_alpha[0,:] - Clift_alpha[1,:]) / (AoA[0] - AoA[1])
training.dClift_dbeta = (Clift_beta[0,:] - Clift_beta[1,:]) / (Beta[0] - Beta[1])
training.dClift_du = (Clift_u[0,:] - Clift_u[1,:]) / (u[0] - u[1])
training.dClift_dv = (Clift_v[0,:] - Clift_v[1,:]) / (v[0] - v[1])
training.dClift_dw = (Clift_w[0,:] - Clift_w[1,:]) / (w[0] - w[1])
training.dClift_dp = (Clift_p[0,:] - Clift_p[1,:]) / (roll_rate[0]-roll_rate[1])
training.dClift_dq = (Clift_q[0,:] - Clift_q[1,:]) / (pitch_rate[0]-pitch_rate[1])
training.dClift_dr = (Clift_r[0,:] - Clift_r[1,:]) / (yaw_rate[0]-yaw_rate[1])
training.dCdrag_dalpha = (Cdrag_alpha[0,:] - Cdrag_alpha[1,:]) / (AoA[0] - AoA[1])
training.dCdrag_dbeta = (Cdrag_beta[0,:] - Cdrag_beta[1,:]) / (Beta[0] - Beta[1])
training.dCdrag_du = (Cdrag_u[0,:] - Cdrag_u[1,:]) / (u[0] - u[1])
training.dCdrag_dv = (Cdrag_v[0,:] - Cdrag_v[1,:]) / (v[0] - v[1])
training.dCdrag_dw = (Cdrag_w[0,:] - Cdrag_w[1,:]) / (w[0] - w[1])
training.dCdrag_dp = (Cdrag_p[0,:] - Cdrag_p[1,:]) / (roll_rate[0]-roll_rate[1])
training.dCdrag_dq = (Cdrag_q[0,:] - Cdrag_q[1,:]) / (pitch_rate[0]-pitch_rate[1])
training.dCdrag_dr = (Cdrag_r[0,:] - Cdrag_r[1,:]) / (yaw_rate[0]-yaw_rate[1])
training.dCX_dalpha = (CX_alpha[0,:] - CX_alpha[1,:]) / (AoA[0] - AoA[1])
training.dCX_dbeta = (CX_beta[0,:] - CX_beta[1,:]) / (Beta[0] - Beta[1])
training.dCX_du = (CX_u[0,:] - CX_u[1,:]) / (u[0] - u[1])
training.dCX_dv = (CX_v[0,:] - CX_v[1,:]) / (v[0] - v[1])
training.dCX_dw = (CX_w[0,:] - CX_w[1,:]) / (w[0] - w[1])
training.dCX_dp = (CX_p[0,:] - CX_p[1,:]) / (roll_rate[0]-roll_rate[1])
training.dCX_dq = (CX_q[0,:] - CX_q[1,:]) / (pitch_rate[0]-pitch_rate[1])
training.dCX_dr = (CX_r[0,:] - CX_r[1,:]) / (yaw_rate[0]-yaw_rate[1])
training.dCY_dalpha = (CY_alpha[0,:] - CY_alpha[1,:]) / (AoA[0] - AoA[1])
training.dCY_dbeta = (CY_beta[0,:] - CY_beta[1,:]) / (Beta[0] - Beta[1])
training.dCY_du = (CY_u[0,:] - CY_u[1,:]) / (u[0] - u[1])
training.dCY_dv = (CY_v[0,:] - CY_v[1,:]) / (v[0] - v[1])
training.dCY_dw = (CY_w[0,:] - CY_w[1,:]) / (w[0] - w[1])
training.dCY_dp = (CY_p[0,:] - CY_p[1,:]) / (roll_rate[0]-roll_rate[1])
training.dCY_dq = (CY_q[0,:] - CY_q[1,:]) / (pitch_rate[0]-pitch_rate[1])
training.dCY_dr = (CY_r[0,:] - CY_r[1,:]) / (yaw_rate[0]-yaw_rate[1])
training.dCZ_dalpha = (CZ_alpha[0,:] - CZ_alpha[1,:]) / (AoA[0] - AoA[1])
training.dCZ_dbeta = (CZ_beta[0,:] - CZ_beta[1,:]) / (Beta[0] - Beta[1])
training.dCZ_du = (CZ_u[0,:] - CZ_u[1,:]) / (u[0] - u[1])
training.dCZ_dv = (CZ_v[0,:] - CZ_v[1,:]) / (v[0] - v[1])
training.dCZ_dw = (CZ_w[0,:] - CZ_w[1,:]) / (w[0] - w[1])
training.dCZ_dp = (CZ_p[0,:] - CZ_p[1,:]) / (roll_rate[0]-roll_rate[1])
training.dCZ_dq = (CZ_q[0,:] - CZ_q[1,:]) / (pitch_rate[0]-pitch_rate[1])
training.dCZ_dr = (CZ_r[0,:] - CZ_r[1,:]) / (yaw_rate[0]-yaw_rate[1])
training.dCL_dalpha = (CL_alpha[0,:] - CL_alpha[1,:]) / (AoA[0] - AoA[1])
training.dCL_dbeta = (CL_beta[0,:] - CL_beta[1,:]) / (Beta[0] - Beta[1])
training.dCL_du = (CL_u[0,:] - CL_u[1,:]) / (u[0] - u[1])
training.dCL_dv = (CL_v[0,:] - CL_v[1,:]) / (v[0] - v[1])
training.dCL_dw = (CL_w[0,:] - CL_w[1,:]) / (w[0] - w[1])
training.dCL_dp = (CL_p[0,:] - CL_p[1,:]) / (roll_rate[0]-roll_rate[1])
training.dCL_dq = (CL_q[0,:] - CL_q[1,:]) / (pitch_rate[0]-pitch_rate[1])
training.dCL_dr = (CL_r[0,:] - CL_r[1,:]) / (yaw_rate[0]-yaw_rate[1])
training.dCM_dalpha = (CM_alpha[0,:] - CM_alpha[1,:]) / (AoA[0] - AoA[1])
training.dCM_dbeta = (CM_beta[0,:] - CM_beta[1,:]) / (Beta[0] - Beta[1])
training.dCM_du = (CM_u[0,:] - CM_u[1,:]) / (u[0] - u[1])
training.dCM_dv = (CM_v[0,:] - CM_v[1,:]) / (v[0] - v[1])
training.dCM_dw = (CM_w[0,:] - CM_w[1,:]) / (w[0] - w[1])
training.dCM_dp = (CM_p[0,:] - CM_p[1,:]) / (roll_rate[0]-roll_rate[1])
training.dCM_dq = (CM_q[0,:] - CM_q[1,:]) / (pitch_rate[0]-pitch_rate[1])
training.dCM_dr = (CM_r[0,:] - CM_r[1,:]) / (yaw_rate[0]-yaw_rate[1])
training.dCN_dalpha = (CN_alpha[0,:] - CN_alpha[1,:]) / (AoA[0] - AoA[1])
training.dCN_dbeta = (CN_beta[0,:] - CN_beta[1,:]) / (Beta[0] - Beta[1])
training.dCN_du = (CN_u[0,:] - CN_u[1,:]) / (u[0] - u[1])
training.dCN_dv = (CN_v[0,:] - CN_v[1,:]) / (v[0] - v[1])
training.dCN_dw = (CN_w[0,:] - CN_w[1,:]) / (w[0] - w[1])
training.dCN_dp = (CN_p[0,:] - CN_p[1,:]) / (roll_rate[0]-roll_rate[1])
training.dCN_dq = (CN_q[0,:] - CN_q[1,:]) / (pitch_rate[0]-pitch_rate[1])
training.dCN_dr = (CN_r[0,:] - CN_r[1,:]) / (yaw_rate[0]-yaw_rate[1])
''' for control surfaces, subtract inflence WITHOUT control surface deflected from coefficients WITH control surfaces'''
# --------------------------------------------------------------------------------------------------------------
# Aileron
# --------------------------------------------------------------------------------------------------------------
if aerodynamics.aileron_flag:
training.Clift_delta_a = np.concatenate((training_subsonic.Clift_delta_a[:,-1][:,None] , training_supersonic.Clift_delta_a[:,0][:,None] ), axis = 1)
training.Cdrag_delta_a = np.concatenate((training_subsonic.Cdrag_delta_a[:,-1][:,None] , training_supersonic.Cdrag_delta_a[:,0][:,None] ), axis = 1)
training.CX_delta_a = np.concatenate((training_subsonic.CX_delta_a[:,-1][:,None] , training_supersonic.CX_delta_a[:,0][:,None] ), axis = 1)
training.CY_delta_a = np.concatenate((training_subsonic.CY_delta_a[:,-1][:,None] , training_supersonic.CY_delta_a[:,0][:,None] ), axis = 1)
training.CZ_delta_a = np.concatenate((training_subsonic.CZ_delta_a[:,-1][:,None] , training_supersonic.CZ_delta_a[:,0][:,None] ), axis = 1)
training.CL_delta_a = np.concatenate((training_subsonic.CL_delta_a[:,-1][:,None] , training_supersonic.CL_delta_a[:,0][:,None] ), axis = 1)
training.CM_delta_a = np.concatenate((training_subsonic.CM_delta_a[:,-1][:,None] , training_supersonic.CM_delta_a[:,0][:,None] ), axis = 1)
training.CN_delta_a = np.concatenate((training_subsonic.CN_delta_a[:,-1][:,None] , training_supersonic.CN_delta_a[:,0][:,None] ), axis = 1)
training.dClift_ddelta_a = np.array([training_subsonic.dClift_ddelta_a[-1] , training_subsonic.dClift_ddelta_a[0]])
training.dCdrag_ddelta_a = np.array([training_subsonic.dCdrag_ddelta_a[-1] , training_subsonic.dCdrag_ddelta_a[0]])
training.dCX_ddelta_a = np.array([training_subsonic.dCX_ddelta_a[-1] , training_subsonic.dCX_ddelta_a[0] ])
training.dCY_ddelta_a = np.array([training_subsonic.dCY_ddelta_a[-1] , training_subsonic.dCY_ddelta_a[0] ])
training.dCZ_ddelta_a = np.array([training_subsonic.dCZ_ddelta_a[-1] , training_subsonic.dCZ_ddelta_a[0] ])
training.dCL_ddelta_a = np.array([training_subsonic.dCL_ddelta_a[-1] , training_subsonic.dCL_ddelta_a[0] ])
training.dCM_ddelta_a = np.array([training_subsonic.dCM_ddelta_a[-1] , training_subsonic.dCM_ddelta_a[0] ])
training.dCN_ddelta_a = np.array([training_subsonic.dCN_ddelta_a[-1] , training_subsonic.dCN_ddelta_a[0] ])
# --------------------------------------------------------------------------------------------------------------
# Elevator
# --------------------------------------------------------------------------------------------------------------
if aerodynamics.elevator_flag:
training.Clift_delta_e = np.concatenate((training_subsonic.Clift_delta_e[:,-1][:,None] , training_supersonic.Clift_delta_e[:,0][:,None] ), axis = 1)
training.Cdrag_delta_e = np.concatenate((training_subsonic.Cdrag_delta_e[:,-1][:,None] , training_supersonic.Cdrag_delta_e[:,0][:,None] ), axis = 1)
training.CX_delta_e = np.concatenate((training_subsonic.CX_delta_e[:,-1][:,None] , training_supersonic.CX_delta_e[:,0][:,None] ), axis = 1)
training.CY_delta_e = np.concatenate((training_subsonic.CY_delta_e[:,-1][:,None] , training_supersonic.CY_delta_e[:,0][:,None] ), axis = 1)
training.CZ_delta_e = np.concatenate((training_subsonic.CZ_delta_e[:,-1][:,None] , training_supersonic.CZ_delta_e[:,0][:,None] ), axis = 1)
training.CL_delta_e = np.concatenate((training_subsonic.CL_delta_e[:,-1][:,None] , training_supersonic.CL_delta_e[:,0][:,None] ), axis = 1)
training.CM_delta_e = np.concatenate((training_subsonic.CM_delta_e[:,-1][:,None] , training_supersonic.CM_delta_e[:,0][:,None] ), axis = 1)
training.CN_delta_e = np.concatenate((training_subsonic.CN_delta_e[:,-1][:,None] , training_supersonic.CN_delta_e[:,0][:,None] ), axis = 1)
training.dClift_ddelta_e = np.array([training_subsonic.dClift_ddelta_e[-1] , training_subsonic.dClift_ddelta_e[0]])
training.dCdrag_ddelta_e = np.array([training_subsonic.dCdrag_ddelta_e[-1] , training_subsonic.dCdrag_ddelta_e[0]])
training.dCX_ddelta_e = np.array([training_subsonic.dCX_ddelta_e[-1] , training_subsonic.dCX_ddelta_e[0] ])
training.dCY_ddelta_e = np.array([training_subsonic.dCY_ddelta_e[-1] , training_subsonic.dCY_ddelta_e[0] ])
training.dCZ_ddelta_e = np.array([training_subsonic.dCZ_ddelta_e[-1] , training_subsonic.dCZ_ddelta_e[0] ])
training.dCL_ddelta_e = np.array([training_subsonic.dCL_ddelta_e[-1] , training_subsonic.dCL_ddelta_e[0] ])
training.dCM_ddelta_e = np.array([training_subsonic.dCM_ddelta_e[-1] , training_subsonic.dCM_ddelta_e[0] ])
training.dCN_ddelta_e = np.array([training_subsonic.dCN_ddelta_e[-1] , training_subsonic.dCN_ddelta_e[0] ])
# --------------------------------------------------------------------------------------------------------------
# Rudder
# --------------------------------------------------------------------------------------------------------------
if aerodynamics.rudder_flag:
training.Clift_delta_r = np.concatenate((training_subsonic.Clift_delta_r[:,-1][:,None] , training_supersonic.Clift_delta_r[:,0][:,None] ), axis = 1)
training.Cdrag_delta_r = np.concatenate((training_subsonic.Cdrag_delta_r[:,-1][:,None] , training_supersonic.Cdrag_delta_r[:,0][:,None] ), axis = 1)
training.CX_delta_r = np.concatenate((training_subsonic.CX_delta_r[:,-1][:,None] , training_supersonic.CX_delta_r[:,0][:,None] ), axis = 1)
training.CY_delta_r = np.concatenate((training_subsonic.CY_delta_r[:,-1][:,None] , training_supersonic.CY_delta_r[:,0][:,None] ), axis = 1)
training.CZ_delta_r = np.concatenate((training_subsonic.CZ_delta_r[:,-1][:,None] , training_supersonic.CZ_delta_r[:,0][:,None] ), axis = 1)
training.CL_delta_r = np.concatenate((training_subsonic.CL_delta_r[:,-1][:,None] , training_supersonic.CL_delta_r[:,0][:,None] ), axis = 1)
training.CM_delta_r = np.concatenate((training_subsonic.CM_delta_r[:,-1][:,None] , training_supersonic.CM_delta_r[:,0][:,None] ), axis = 1)
training.CN_delta_r = np.concatenate((training_subsonic.CN_delta_r[:,-1][:,None] , training_supersonic.CN_delta_r[:,0][:,None] ), axis = 1)
training.dClift_ddelta_r = np.array([training_subsonic.dClift_ddelta_r[-1] , training_subsonic.dClift_ddelta_r[0]])
training.dCdrag_ddelta_r = np.array([training_subsonic.dCdrag_ddelta_r[-1] , training_subsonic.dCdrag_ddelta_r[0]])
training.dCX_ddelta_r = np.array([training_subsonic.dCX_ddelta_r[-1] , training_subsonic.dCX_ddelta_r[0] ])
training.dCY_ddelta_r = np.array([training_subsonic.dCY_ddelta_r[-1] , training_subsonic.dCY_ddelta_r[0] ])
training.dCZ_ddelta_r = np.array([training_subsonic.dCZ_ddelta_r[-1] , training_subsonic.dCZ_ddelta_r[0] ])
training.dCL_ddelta_r = np.array([training_subsonic.dCL_ddelta_r[-1] , training_subsonic.dCL_ddelta_r[0] ])
training.dCM_ddelta_r = np.array([training_subsonic.dCM_ddelta_r[-1] , training_subsonic.dCM_ddelta_r[0] ])
training.dCN_ddelta_r = np.array([training_subsonic.dCN_ddelta_r[-1] , training_subsonic.dCN_ddelta_r[0] ])
# --------------------------------------------------------------------------------------------------------------
# Flap
# --------------------------------------------------------------------------------------------------------------
if aerodynamics.flap_flag:
training.Clift_delta_f = np.concatenate((training_subsonic.Clift_delta_f[:,-1][:,None] , training_supersonic.Clift_delta_f[:,0][:,None] ), axis = 1)
training.Cdrag_delta_f = np.concatenate((training_subsonic.Cdrag_delta_f[:,-1][:,None] , training_supersonic.Cdrag_delta_f[:,0][:,None] ), axis = 1)
training.CX_delta_f = np.concatenate((training_subsonic.CX_delta_f[:,-1][:,None] , training_supersonic.CX_delta_f[:,0][:,None] ), axis = 1)
training.CY_delta_f = np.concatenate((training_subsonic.CY_delta_f[:,-1][:,None] , training_supersonic.CY_delta_f[:,0][:,None] ), axis = 1)
training.CZ_delta_f = np.concatenate((training_subsonic.CZ_delta_f[:,-1][:,None] , training_supersonic.CZ_delta_f[:,0][:,None] ), axis = 1)
training.CL_delta_f = np.concatenate((training_subsonic.CL_delta_f[:,-1][:,None] , training_supersonic.CL_delta_f[:,0][:,None] ), axis = 1)
training.CM_delta_f = np.concatenate((training_subsonic.CM_delta_f[:,-1][:,None] , training_supersonic.CM_delta_f[:,0][:,None] ), axis = 1)
training.CN_delta_f = np.concatenate((training_subsonic.CN_delta_f[:,-1][:,None] , training_supersonic.CN_delta_f[:,0][:,None] ), axis = 1)
training.dClift_ddelta_f = np.array([training_subsonic.dClift_ddelta_f[-1] , training_subsonic.dClift_ddelta_f[0]])
training.dCdrag_ddelta_f = np.array([training_subsonic.dCdrag_ddelta_f[-1] , training_subsonic.dCdrag_ddelta_f[0]])
training.dCX_ddelta_f = np.array([training_subsonic.dCX_ddelta_f[-1] , training_subsonic.dCX_ddelta_f[0] ])
training.dCY_ddelta_f = np.array([training_subsonic.dCY_ddelta_f[-1] , training_subsonic.dCY_ddelta_f[0] ])
training.dCZ_ddelta_f = np.array([training_subsonic.dCZ_ddelta_f[-1] , training_subsonic.dCZ_ddelta_f[0] ])
training.dCL_ddelta_f = np.array([training_subsonic.dCL_ddelta_f[-1] , training_subsonic.dCL_ddelta_f[0] ])
training.dCM_ddelta_f = np.array([training_subsonic.dCM_ddelta_f[-1] , training_subsonic.dCM_ddelta_f[0] ])
training.dCN_ddelta_f = np.array([training_subsonic.dCN_ddelta_f[-1] , training_subsonic.dCN_ddelta_f[0] ])
# --------------------------------------------------------------------------------------------------------------
# Slat
# --------------------------------------------------------------------------------------------------------------
if aerodynamics.slat_flag:
training.Clift_delta_s = np.concatenate((training_subsonic.Clift_delta_s[:,-1][:,None] , training_supersonic.Clift_delta_s[:,0][:,None] ), axis = 1)
training.Cdrag_delta_s = np.concatenate((training_subsonic.Cdrag_delta_s[:,-1][:,None] , training_supersonic.Cdrag_delta_s[:,0][:,None] ), axis = 1)
training.CX_delta_s = np.concatenate((training_subsonic.CX_delta_s[:,-1][:,None] , training_supersonic.CX_delta_s[:,0][:,None] ), axis = 1)
training.CY_delta_s = np.concatenate((training_subsonic.CY_delta_s[:,-1][:,None] , training_supersonic.CY_delta_s[:,0][:,None] ), axis = 1)
training.CZ_delta_s = np.concatenate((training_subsonic.CZ_delta_s[:,-1][:,None] , training_supersonic.CZ_delta_s[:,0][:,None] ), axis = 1)
training.CL_delta_s = np.concatenate((training_subsonic.CL_delta_s[:,-1][:,None] , training_supersonic.CL_delta_s[:,0][:,None] ), axis = 1)
training.CM_delta_s = np.concatenate((training_subsonic.CM_delta_s[:,-1][:,None] , training_supersonic.CM_delta_s[:,0][:,None] ), axis = 1)
training.CN_delta_s = np.concatenate((training_subsonic.CN_delta_s[:,-1][:,None] , training_supersonic.CN_delta_s[:,0][:,None] ), axis = 1)
training.dClift_ddelta_s = np.array([training_subsonic.dClift_ddelta_s[-1] , training_subsonic.dClift_ddelta_s[0]])
training.dCdrag_ddelta_s = np.array([training_subsonic.dCdrag_ddelta_s[-1] , training_subsonic.dCdrag_ddelta_s[0]])
training.dCX_ddelta_s = np.array([training_subsonic.dCX_ddelta_s[-1] , training_subsonic.dCX_ddelta_s[0] ])
training.dCY_ddelta_s = np.array([training_subsonic.dCY_ddelta_s[-1] , training_subsonic.dCY_ddelta_s[0] ])
training.dCZ_ddelta_s = np.array([training_subsonic.dCZ_ddelta_s[-1] , training_subsonic.dCZ_ddelta_s[0] ])
training.dCL_ddelta_s = np.array([training_subsonic.dCL_ddelta_s[-1] , training_subsonic.dCL_ddelta_s[0] ])
training.dCM_ddelta_s = np.array([training_subsonic.dCM_ddelta_s[-1] , training_subsonic.dCM_ddelta_s[0] ])
training.dCN_ddelta_s = np.array([training_subsonic.dCN_ddelta_s[-1] , training_subsonic.dCN_ddelta_s[0] ])
training.NP = 0
return training