Source code for RCAIDE.Library.Methods.Aerodynamics.Vortex_Lattice_Method.evaluate_VLM

# RCAIDE/Library/Methods/Aerodynamics/Vortex_Lattice_Method/evaluate_VLM.py
 
# ----------------------------------------------------------------------------------------------------------------------
#  IMPORT
# ----------------------------------------------------------------------------------------------------------------------

# RCAIDE imports  
import RCAIDE 
from RCAIDE.Framework.Core                                               import Data, orientation_product 
from RCAIDE.Library.Methods.Aerodynamics.Vortex_Lattice_Method.VLM       import VLM
from RCAIDE.Library.Methods.Utilities                                    import Cubic_Spline_Blender 
from RCAIDE.Library.Mission.Common.Update                                import orientations
from RCAIDE.Library.Mission.Common.Unpack_Unknowns                       import orientation

# package imports
import numpy   as np
from copy      import  deepcopy 

# ----------------------------------------------------------------------------------------------------------------------
#  Vortex_Lattice
# ---------------------------------------------------------------------------------------------------------------------- 
[docs] def evaluate_surrogate(state,settings,vehicle): """Evaluates forces and moments using built surrogates Assumptions: - Drag due to angle of attack is the dominant drag component and the only one calculated - Aircraft is symmetric such that CY_L_0 = 0 and CN_L_0 = 0 Source: None Args: aerodynamics : VLM analysis [unitless] state : flight conditions [unitless] settings : VLM analysis settings [unitless] vehicle : vehicle configuration [unitless] Returns: None """ conditions = state.conditions aerodynamics = state.analyses.aerodynamics sub_sur = aerodynamics.surrogates.subsonic sup_sur = aerodynamics.surrogates.supersonic trans_sur = aerodynamics.surrogates.transonic AoA = np.atleast_2d(conditions.aerodynamics.angles.alpha) Beta = np.atleast_2d(conditions.aerodynamics.angles.beta) Mach = np.atleast_2d(conditions.freestream.mach_number) ones_row = np.ones_like(AoA) hsub_min = aerodynamics.surrogates.subsonic_smoothing_min hsub_max = aerodynamics.surrogates.subsonic_smoothing_max hsup_min = aerodynamics.surrogates.supersonic_smoothing_min hsup_max = aerodynamics.surrogates.supersonic_smoothing_max # Spline for Subsonic-to-Transonic-to-Supersonic Regimes sub_trans_spline = Cubic_Spline_Blender(hsub_min,hsub_max) h_sub = lambda M:sub_trans_spline.compute(M) sup_trans_spline = Cubic_Spline_Blender(hsup_max, hsup_min) h_sup = lambda M:sup_trans_spline.compute(M) #Alpha pts_alpha = np.hstack((AoA,Mach)) results_alpha = compute_coefficients(sub_sur.Clift_alpha, sub_sur.Cdrag_induced_alpha, sub_sur.CX_alpha, sub_sur.CY_alpha, sub_sur.CZ_alpha, sub_sur.CL_alpha, sub_sur.CM_alpha, sub_sur.CN_alpha, trans_sur.Clift_alpha,trans_sur.Cdrag_induced_alpha,trans_sur.CX_alpha,trans_sur.CY_alpha,trans_sur.CZ_alpha,trans_sur.CL_alpha,trans_sur.CM_alpha, trans_sur.CN_alpha, sup_sur.Clift_alpha, sup_sur.Cdrag_induced_alpha, sup_sur.CX_alpha, sup_sur.CY_alpha, sup_sur.CZ_alpha, sup_sur.CL_alpha, sup_sur.CM_alpha, sup_sur.CN_alpha, sub_sur.Clift_spanwise, trans_sur.Clift_spanwise, sup_sur.Clift_spanwise, h_sub,h_sup,Mach, pts_alpha) conditions.aerodynamics.coefficients.lift.inviscid.total = results_alpha.Clift conditions.aerodynamics.coefficients.drag.induced.inviscid = results_alpha.Cdrag conditions.static_stability.coefficients.M = results_alpha.CM conditions.static_stability.coefficients.M_0 = compute_stability_derivative(sub_sur.CM_0 ,trans_sur.CM_0 ,sup_sur.CM_0 ,h_sub,h_sup,Mach) conditions.aerodynamics.coefficients.lift.spanwise = results_alpha.Clift_spanwise # ----------------------------------------------------------------------------------------------------------------------- # Query control surface surrogates if derivatives are not user defined # ----------------------------------------------------------------------------------------------------------------------- if aerodynamics.stability_derivatives.CX_alpha == None: conditions.static_stability.derivatives.CX_alpha = compute_stability_derivative(sub_sur.dCX_dalpha ,trans_sur.dCX_dalpha ,sup_sur.dCX_dalpha ,h_sub,h_sup,Mach) else: conditions.static_stability.derivatives.CX_alpha = aerodynamics.stability_derivatives.CX_alpha * ones_row if aerodynamics.stability_derivatives.CZ_alpha == None: conditions.static_stability.derivatives.CZ_alpha = compute_stability_derivative(sub_sur.dCZ_dalpha ,trans_sur.dCZ_dalpha ,sup_sur.dCZ_dalpha ,h_sub,h_sup,Mach) else: conditions.static_stability.derivatives.CZ_alpha = aerodynamics.stability_derivatives.CZ_alpha * ones_row if aerodynamics.stability_derivatives.CM_alpha == None: conditions.static_stability.derivatives.CM_alpha = compute_stability_derivative(sub_sur.dCM_dalpha ,trans_sur.dCM_dalpha ,sup_sur.dCM_dalpha ,h_sub,h_sup,Mach) else: conditions.static_stability.derivatives.CM_alpha = aerodynamics.stability_derivatives.CM_alpha * ones_row if aerodynamics.stability_derivatives.CY_beta == None: conditions.static_stability.derivatives.CY_beta = compute_stability_derivative(sub_sur.dCY_dbeta ,trans_sur.dCY_dbeta ,sup_sur.dCY_dbeta ,h_sub,h_sup,Mach) else: conditions.static_stability.derivatives.CY_beta = aerodynamics.stability_derivatives.CY_beta * ones_row if aerodynamics.stability_derivatives.CL_beta == None: conditions.static_stability.derivatives.CL_beta = compute_stability_derivative(sub_sur.dCL_dbeta ,trans_sur.dCL_dbeta ,sup_sur.dCL_dbeta ,h_sub,h_sup,Mach) else: conditions.static_stability.derivatives.CL_beta = aerodynamics.stability_derivatives.CL_beta * ones_row if aerodynamics.stability_derivatives.CN_beta == None: conditions.static_stability.derivatives.CN_beta = compute_stability_derivative(sub_sur.dCN_dbeta ,trans_sur.dCN_dbeta ,sup_sur.dCN_dbeta ,h_sub,h_sup,Mach) else: conditions.static_stability.derivatives.CN_beta = aerodynamics.stability_derivatives.CN_beta * ones_row if aerodynamics.stability_derivatives.CX_u == None: conditions.static_stability.derivatives.CX_u = compute_stability_derivative(sub_sur.dCX_du ,trans_sur.dCX_du ,sup_sur.dCX_du ,h_sub,h_sup,Mach) else: conditions.static_stability.derivatives.CX_u = aerodynamics.stability_derivatives.CX_u * ones_row if aerodynamics.stability_derivatives.CZ_u == None: conditions.static_stability.derivatives.CZ_u = compute_stability_derivative(sub_sur.dCZ_du ,trans_sur.dCZ_du ,sup_sur.dCZ_du ,h_sub,h_sup,Mach) else: conditions.static_stability.derivatives.CZ_u = aerodynamics.stability_derivatives.CZ_u * ones_row if aerodynamics.stability_derivatives.CM_u == None: conditions.static_stability.derivatives.CM_u = compute_stability_derivative(sub_sur.dCM_du ,trans_sur.dCM_du ,sup_sur.dCM_du ,h_sub,h_sup,Mach) else: conditions.static_stability.derivatives.CM_u = aerodynamics.stability_derivatives.CM_u * ones_row if aerodynamics.stability_derivatives.CY_r == None: conditions.static_stability.derivatives.CY_r = compute_stability_derivative(sub_sur.dCY_dr ,trans_sur.dCY_dr ,sup_sur.dCY_dr ,h_sub,h_sup,Mach) else: conditions.static_stability.derivatives.CY_r = aerodynamics.stability_derivatives.CY_r * ones_row if aerodynamics.stability_derivatives.CZ_q == None: conditions.static_stability.derivatives.CZ_q = compute_stability_derivative(sub_sur.dCZ_dq ,trans_sur.dCZ_dq ,sup_sur.dCZ_dq ,h_sub,h_sup,Mach) else: conditions.static_stability.derivatives.CZ_q = aerodynamics.stability_derivatives.CZ_q*ones_row if aerodynamics.stability_derivatives.CL_p == None: conditions.static_stability.derivatives.CL_p = compute_stability_derivative(sub_sur.dCL_dp ,trans_sur.dCL_dp ,sup_sur.dCL_dp ,h_sub,h_sup,Mach) else: conditions.static_stability.derivatives.CL_p = aerodynamics.stability_derivatives.CL_p*ones_row if aerodynamics.stability_derivatives.CL_r == None: conditions.static_stability.derivatives.CL_r = compute_stability_derivative(sub_sur.dCL_dr ,trans_sur.dCL_dr ,sup_sur.dCL_dr ,h_sub,h_sup,Mach) else: conditions.static_stability.derivatives.CL_r = aerodynamics.stability_derivatives.CL_r * ones_row if aerodynamics.stability_derivatives.CM_q == None: conditions.static_stability.derivatives.CM_q = compute_stability_derivative(sub_sur.dCM_dq ,trans_sur.dCM_dq ,sup_sur.dCM_dq ,h_sub,h_sup,Mach) else: conditions.static_stability.derivatives.CM_q = aerodynamics.stability_derivatives.CM_q * ones_row if aerodynamics.stability_derivatives.CN_p == None: conditions.static_stability.derivatives.CN_p = compute_stability_derivative(sub_sur.dCN_dp ,trans_sur.dCN_dp ,sup_sur.dCN_dp ,h_sub,h_sup,Mach) else: conditions.static_stability.derivatives.CN_p = aerodynamics.stability_derivatives.CN_p * ones_row if aerodynamics.stability_derivatives.CN_r == None: conditions.static_stability.derivatives.CN_r = compute_stability_derivative(sub_sur.dCN_dr ,trans_sur.dCN_dr ,sup_sur.dCN_dr ,h_sub,h_sup,Mach) else: conditions.static_stability.derivatives.CN_r = aerodynamics.stability_derivatives.CN_r * ones_row if aerodynamics.stability_derivatives.Clift_alpha == None: conditions.static_stability.derivatives.Clift_alpha = compute_stability_derivative(sub_sur.dClift_dalpha ,trans_sur.dClift_dalpha ,sup_sur.dClift_dalpha ,h_sub,h_sup,Mach) else: conditions.static_stability.derivatives.Clift_alpha = aerodynamics.stability_derivatives.Clift_alpha * ones_row conditions.static_stability.coefficients.Y = conditions.static_stability.derivatives.CY_beta * Beta conditions.static_stability.coefficients.L = conditions.static_stability.derivatives.CL_beta * Beta conditions.static_stability.coefficients.N = conditions.static_stability.derivatives.CN_beta * Beta # ----------------------------------------------------------------------------------------------------------------------- # Addition of Control Surface Effect # ----------------------------------------------------------------------------------------------------------------------- # Aileron if aerodynamics.aileron_flag: if aerodynamics.stability_derivatives.CY_delta_a == None: conditions.static_stability.derivatives.CY_delta_a = compute_stability_derivative(sub_sur.dCY_ddelta_a ,trans_sur.dCY_ddelta_a ,sup_sur.dCY_ddelta_a ,h_sub,h_sup,Mach) else: conditions.static_stability.derivatives.CY_delta_a = aerodynamics.stability_derivatives.CY_delta_a* ones_row if aerodynamics.stability_derivatives.CL_delta_a == None: conditions.static_stability.derivatives.CL_delta_a = compute_stability_derivative(sub_sur.dCL_ddelta_a ,trans_sur.dCL_ddelta_a ,sup_sur.dCL_ddelta_a ,h_sub,h_sup,Mach) else: conditions.static_stability.derivatives.CL_delta_a = aerodynamics.stability_derivatives.CL_delta_a* ones_row if aerodynamics.stability_derivatives.CN_delta_a == None: conditions.static_stability.derivatives.CN_delta_a = compute_stability_derivative(sub_sur.dCN_ddelta_a ,trans_sur.dCN_ddelta_a ,sup_sur.dCN_ddelta_a ,h_sub,h_sup,Mach) else: conditions.static_stability.derivatives.CN_delta_a = aerodynamics.stability_derivatives.CN_delta_a* ones_row if aerodynamics.stability_derivatives.Cdrag_delta_a == None: conditions.static_stability.derivatives.Cdrag_delta_a = compute_stability_derivative(sub_sur.dCdrag_ddelta_a ,trans_sur.dCdrag_ddelta_a ,sup_sur.dCdrag_ddelta_a ,h_sub,h_sup,Mach) else: conditions.static_stability.derivatives.Cdrag_delta_a = aerodynamics.stability_derivatives.Cdrag_delta_a* ones_row conditions.static_stability.coefficients.Y += conditions.static_stability.derivatives.CY_delta_a * conditions.control_surfaces.aileron.deflection conditions.static_stability.coefficients.L += conditions.static_stability.derivatives.CL_delta_a * conditions.control_surfaces.aileron.deflection conditions.static_stability.coefficients.N += conditions.static_stability.derivatives.CN_delta_a * conditions.control_surfaces.aileron.deflection conditions.aerodynamics.coefficients.drag.induced.inviscid += conditions.static_stability.derivatives.Cdrag_delta_a * conditions.control_surfaces.aileron.deflection conditions.control_surfaces.aileron.static_stability.coefficients.Y = conditions.static_stability.derivatives.CY_delta_a * conditions.control_surfaces.aileron.deflection conditions.control_surfaces.aileron.static_stability.coefficients.L = conditions.static_stability.derivatives.CL_delta_a * conditions.control_surfaces.aileron.deflection conditions.control_surfaces.aileron.static_stability.coefficients.N = conditions.static_stability.derivatives.CN_delta_a * conditions.control_surfaces.aileron.deflection # Elevator if aerodynamics.elevator_flag: if aerodynamics.stability_derivatives.CM_delta_e == None: conditions.static_stability.derivatives.CM_delta_e = compute_stability_derivative(sub_sur.dCM_ddelta_e ,trans_sur.dCM_ddelta_e ,sup_sur.dCM_ddelta_e ,h_sub,h_sup,Mach) else: conditions.static_stability.derivatives.CM_delta_e = aerodynamics.stability_derivatives.CM_delta_e * ones_row if aerodynamics.stability_derivatives.Clift_delta_e == None: conditions.static_stability.derivatives.Clift_delta_e = compute_stability_derivative(sub_sur.dClift_ddelta_e ,trans_sur.dClift_ddelta_e ,sup_sur.dClift_ddelta_e ,h_sub,h_sup,Mach) else: conditions.static_stability.derivatives.Clift_delta_e = aerodynamics.stability_derivatives.Clift_delta_e* ones_row if aerodynamics.stability_derivatives.Cdrag_delta_e == None: conditions.static_stability.derivatives.Cdrag_delta_e = compute_stability_derivative(sub_sur.dCdrag_ddelta_e ,trans_sur.dCdrag_ddelta_e ,sup_sur.dCdrag_ddelta_e ,h_sub,h_sup,Mach) else: conditions.static_stability.derivatives.Cdrag_delta_e = aerodynamics.stability_derivatives.Cdrag_delta_e* ones_row conditions.static_stability.coefficients.M += conditions.static_stability.derivatives.CM_delta_e * conditions.control_surfaces.elevator.deflection conditions.aerodynamics.coefficients.drag.induced.inviscid += conditions.static_stability.derivatives.Cdrag_delta_e * conditions.control_surfaces.elevator.deflection conditions.control_surfaces.elevator.static_stability.coefficients.M = conditions.static_stability.derivatives.CM_delta_e * conditions.control_surfaces.elevator.deflection # Rudder if aerodynamics.rudder_flag: if aerodynamics.stability_derivatives.CY_delta_r == None: conditions.static_stability.derivatives.CY_delta_r = compute_stability_derivative(sub_sur.dCY_ddelta_r,trans_sur.dCY_ddelta_r ,sup_sur.dCY_ddelta_r ,h_sub,h_sup,Mach) else: conditions.static_stability.derivatives.CY_delta_r = aerodynamics.stability_derivatives.CY_delta_r* ones_row if aerodynamics.stability_derivatives.CL_delta_r == None: conditions.static_stability.derivatives.CL_delta_r = compute_stability_derivative(sub_sur.dCL_ddelta_r,trans_sur.dCL_ddelta_r ,sup_sur.dCL_ddelta_r ,h_sub,h_sup,Mach) else: conditions.static_stability.derivatives.CL_delta_r = aerodynamics.stability_derivatives.CL_delta_r* ones_row if aerodynamics.stability_derivatives.CN_delta_r == None: conditions.static_stability.derivatives.CN_delta_r = compute_stability_derivative(sub_sur.dCN_ddelta_r ,trans_sur.dCN_ddelta_r ,sup_sur.dCN_ddelta_r ,h_sub,h_sup,Mach) else: conditions.static_stability.derivatives.CN_delta_r = aerodynamics.stability_derivatives.CN_delta_r* ones_row if aerodynamics.stability_derivatives.Cdrag_delta_r == None: conditions.static_stability.derivatives.Cdrag_delta_r = compute_stability_derivative(sub_sur.dCdrag_ddelta_r ,trans_sur.dCdrag_ddelta_r ,sup_sur.dCdrag_ddelta_r ,h_sub,h_sup,Mach) else: conditions.static_stability.derivatives.Cdrag_delta_r = aerodynamics.stability_derivatives.Cdrag_delta_r* ones_row conditions.static_stability.coefficients.Y += conditions.static_stability.derivatives.CY_delta_r * conditions.control_surfaces.rudder.deflection conditions.static_stability.coefficients.L += conditions.static_stability.derivatives.CL_delta_r * conditions.control_surfaces.rudder.deflection conditions.static_stability.coefficients.N += conditions.static_stability.derivatives.CN_delta_r * conditions.control_surfaces.rudder.deflection conditions.aerodynamics.coefficients.drag.induced.inviscid += conditions.static_stability.derivatives.Cdrag_delta_r* conditions.control_surfaces.rudder.deflection conditions.control_surfaces.rudder.static_stability.coefficients.Y = conditions.static_stability.derivatives.CY_delta_r * conditions.control_surfaces.rudder.deflection conditions.control_surfaces.rudder.static_stability.coefficients.L = conditions.static_stability.derivatives.CL_delta_r * conditions.control_surfaces.rudder.deflection conditions.control_surfaces.rudder.static_stability.coefficients.N = conditions.static_stability.derivatives.CN_delta_r * conditions.control_surfaces.rudder.deflection # ----------------------------------------------------------------------------------------------------------------------- # Flap # ----------------------------------------------------------------------------------------------------------------------- if aerodynamics.flap_flag: if aerodynamics.stability_derivatives.CM_delta_f == None: conditions.static_stability.derivatives.CM_delta_f = compute_stability_derivative(sub_sur.dCM_ddelta_f ,trans_sur.dCM_ddelta_f ,sup_sur.dCM_ddelta_f ,h_sub,h_sup,Mach) else: conditions.static_stability.derivatives.CM_delta_f = aerodynamics.stability_derivatives.CM_delta_f* ones_row if aerodynamics.stability_derivatives.Clift_delta_f == None: conditions.static_stability.derivatives.Clift_delta_f = compute_stability_derivative(sub_sur.dClift_ddelta_f ,trans_sur.dClift_ddelta_f ,sup_sur.dClift_ddelta_f ,h_sub,h_sup,Mach) else: conditions.static_stability.derivatives.Clift_delta_f = aerodynamics.stability_derivatives.Clift_delta_f* ones_row if aerodynamics.stability_derivatives.Cdrag_delta_f == None: conditions.static_stability.derivatives.Cdrag_delta_f = compute_stability_derivative(sub_sur.dCdrag_ddelta_f ,trans_sur.dCdrag_ddelta_f ,sup_sur.dCdrag_ddelta_f ,h_sub,h_sup,Mach) else: conditions.static_stability.derivatives.Cdrag_delta_f = aerodynamics.stability_derivatives.Cdrag_delta_f* ones_row conditions.static_stability.coefficients.M += conditions.static_stability.derivatives.CM_delta_f * conditions.control_surfaces.flap.deflection conditions.static_stability.coefficients.Z += conditions.static_stability.derivatives.Clift_delta_f * conditions.control_surfaces.flap.deflection conditions.aerodynamics.coefficients.drag.induced.inviscid += conditions.static_stability.derivatives.Cdrag_delta_f* conditions.control_surfaces.flap.deflection conditions.aerodynamics.coefficients.lift.inviscid.total += conditions.static_stability.derivatives.Clift_delta_f * conditions.control_surfaces.flap.deflection conditions.control_surfaces.flap.static_stability.coefficients.M = conditions.static_stability.derivatives.CM_delta_f * conditions.control_surfaces.flap.deflection # ----------------------------------------------------------------------------------------------------------------------- # Slat # ----------------------------------------------------------------------------------------------------------------------- if aerodynamics.slat_flag: if aerodynamics.stability_derivatives.CM_delta_s == None: conditions.static_stability.derivatives.CM_delta_s = compute_stability_derivative(sub_sur.dCM_ddelta_s ,trans_sur.dCM_ddelta_s ,sup_sur.dCM_ddelta_s ,h_sub,h_sup,Mach) else: conditions.static_stability.derivatives.CM_delta_s = aerodynamics.stability_derivatives.CM_delta_s* ones_row if aerodynamics.stability_derivatives.Clift_delta_s == None: conditions.static_stability.derivatives.Clift_delta_s = compute_stability_derivative(sub_sur.dClift_ddelta_s ,trans_sur.dClift_ddelta_s ,sup_sur.dClift_ddelta_s ,h_sub,h_sup,Mach) else: conditions.static_stability.derivatives.Clift_delta_s = aerodynamics.stability_derivatives.Clift_delta_s* ones_row if aerodynamics.stability_derivatives.Cdrag_delta_s == None: conditions.static_stability.derivatives.Cdrag_delta_s = compute_stability_derivative(sub_sur.dCdrag_ddelta_s ,trans_sur.dCdrag_ddelta_s ,sup_sur.dCdrag_ddelta_s ,h_sub,h_sup,Mach) else: conditions.static_stability.derivatives.Cdrag_delta_s = aerodynamics.stability_derivatives.Cdrag_delta_s* ones_row conditions.static_stability.coefficients.M += conditions.static_stability.derivatives.CM_delta_s * conditions.control_surfaces.slat.deflection conditions.static_stability.coefficients.Z += conditions.static_stability.derivatives.Clift_delta_s * conditions.control_surfaces.slat.deflection conditions.aerodynamics.coefficients.drag.induced.inviscid += conditions.static_stability.derivatives.Cdrag_delta_s* conditions.control_surfaces.slat.deflection conditions.aerodynamics.coefficients.lift.inviscid.total += conditions.static_stability.derivatives.Clift_delta_s * conditions.control_surfaces.slat.deflection conditions.control_surfaces.slat.static_stability.coefficients.M = conditions.static_stability.derivatives.CM_delta_s * conditions.control_surfaces.slat.deflection return
[docs] def evaluate_no_surrogate(state,settings,vehicle): """Evaluates forces and moments directly using VLM. Assumptions: Source: None Args: aerodynamics : VLM analysis [unitless] state : flight conditions [unitless] settings : VLM analysis settings [unitless] vehicle : vehicle configuration [unitless] Returns: None """ # unpack conditions = state.conditions aerodynamics = state.analyses.aerodynamics n_cpts = len(conditions.aerodynamics.angles.alpha) alt = conditions.freestream.altitude g = conditions.freestream.gravity V = conditions.freestream.velocity MAC = vehicle.reference_chord b = vehicle.reference_span VLM_results = VLM(conditions,settings,vehicle) Clift = VLM_results.CLift Cdrag = VLM_results.CDrag_induced CX = VLM_results.CX CY = VLM_results.CY CZ = VLM_results.CZ CL = VLM_results.CL CM = VLM_results.CM CN = VLM_results.CN conditions.aerodynamics.coefficients.lift.inviscid.wings = VLM_results.CLift_wings conditions.aerodynamics.coefficients.lift.inviscid.total = Clift conditions.aerodynamics.coefficients.lift.spanwise = VLM_results.sectional_CLift conditions.aerodynamics.coefficients.drag.induced.wings = VLM_results.CDrag_induced_wings conditions.aerodynamics.coefficients.drag.induced.spanwise = VLM_results.sectional_CDrag_induced conditions.aerodynamics.coefficients.drag.induced.inviscid = Cdrag conditions.aerodynamics.coefficients.differential_surface_pressure= VLM_results.CP conditions.aerodynamics.angles.induced = VLM_results.alpha_induced conditions.aerodynamics.spanwise_stations = VLM_results.spanwise_stations # corrections RCAIDE.Library.Methods.Aerodynamics.Common.Lift.fuselage_correction(state,settings,vehicle) for wing in vehicle.wings: RCAIDE.Library.Methods.Aerodynamics.Common.Drag.parasite_drag_wing(state,settings,wing) for fuslage in vehicle.fuselages: RCAIDE.Library.Methods.Aerodynamics.Common.Drag.parasite_drag_fuselage(state,settings,fuslage) for boom in vehicle.booms: RCAIDE.Library.Methods.Aerodynamics.Common.Drag.parasite_drag_fuselage(state,settings,boom) RCAIDE.Library.Methods.Aerodynamics.Common.Drag.parasite_drag_nacelle(state,settings,vehicle) RCAIDE.Library.Methods.Aerodynamics.Common.Drag.parasite_drag_pylon(state,settings,vehicle) RCAIDE.Library.Methods.Aerodynamics.Common.Drag.parasite_total(state,settings,vehicle) RCAIDE.Library.Methods.Aerodynamics.Common.Drag.induced_drag(state,settings,vehicle) RCAIDE.Library.Methods.Aerodynamics.Common.Drag.cooling_drag(state,settings,vehicle) RCAIDE.Library.Methods.Aerodynamics.Common.Drag.compressibility_drag(state,settings,vehicle) RCAIDE.Library.Methods.Aerodynamics.Common.Drag.miscellaneous_drag(state,settings,vehicle) RCAIDE.Library.Methods.Aerodynamics.Common.Drag.form_drag(state,settings,vehicle) RCAIDE.Library.Methods.Aerodynamics.Common.Drag.trim_drag(state,settings,vehicle) RCAIDE.Library.Methods.Aerodynamics.Common.Drag.total_drag(state,settings,vehicle) T_wind2inertial = conditions.frames.wind.transform_to_inertial no_beta = np.all(conditions.aerodynamics.angles.beta == 0) aileron = getattr(conditions.control_surfaces, 'aileron', None) rudder = getattr(conditions.control_surfaces, 'rudder', None) no_ail = True if aileron is None else np.all(aileron.deflection == 0) no_rud = True if rudder is None else np.all(rudder.deflection == 0) no_bank = np.all(conditions.aerodynamics.angles.phi == 0) if no_beta and no_ail and no_rud and no_bank: CY = CY * 0 conditions.static_stability.coefficients.X = CX conditions.static_stability.coefficients.Y = CY conditions.static_stability.coefficients.Z = CZ conditions.static_stability.coefficients.L = CL conditions.static_stability.coefficients.M = CM conditions.static_stability.coefficients.N = CN # -------------------------------------------------------------------------------------------- # Unpack Pertubations # -------------------------------------------------------------------------------------------- delta_angle = aerodynamics.training.angle_purtubation delta_speed = aerodynamics.training.speed_purtubation delta_rate = aerodynamics.training.rate_purtubation delta_ctrl_surf = aerodynamics.training.control_surface_purtubation # -------------------------------------------------------------------------------------------- # Equilibrium Condition # -------------------------------------------------------------------------------------------- equilibrium_conditions = create_conditions(n_cpts,alt,g,V,MAC,conditions.energy) VLM_results = VLM(equilibrium_conditions,settings,vehicle) CY_0 = VLM_results.CY CZ_0 = VLM_results.CZ CL_0 = VLM_results.CL CM_0 = VLM_results.CM CN_0 = VLM_results.CN # store CM at 0 AoA conditions.static_stability.coefficients.M_0 = CM_0 # Dimensionalize the lift and drag for each wing equilibrium_conditions.aerodynamics.coefficients.lift.inviscid.wings = VLM_results.CLift_wings equilibrium_conditions.aerodynamics.coefficients.lift.inviscid.total = VLM_results.CLift equilibrium_conditions.aerodynamics.coefficients.lift.spanwise = VLM_results.sectional_CLift equilibrium_conditions.aerodynamics.coefficients.drag.induced.wings = VLM_results.CDrag_induced_wings equilibrium_conditions.aerodynamics.coefficients.drag.induced.spanwise = VLM_results.sectional_CDrag_induced equilibrium_conditions.aerodynamics.coefficients.drag.induced.inviscid = VLM_results.CDrag_induced equilibrium_conditions.aerodynamics.coefficients.differential_surface_pressure= VLM_results.CP equilibrium_conditions.aerodynamics.angles.induced = VLM_results.alpha_induced equilibrium_conditions.aerodynamics.spanwise_stations = VLM_results.spanwise_stations equilibrium_state = RCAIDE.Framework.Mission.Common.State() equilibrium_state.conditions = equilibrium_conditions equilibrium_segment = RCAIDE.Framework.Mission.Segments.Single_Point.Set_Speed_Set_Altitude() equilibrium_segment.conditions = equilibrium_conditions equilibrium_segment.state.conditions = equilibrium_conditions orientation(equilibrium_segment) orientations(equilibrium_segment) RCAIDE.Library.Methods.Aerodynamics.Common.Lift.fuselage_correction(equilibrium_state,settings,vehicle) for wing in vehicle.wings: RCAIDE.Library.Methods.Aerodynamics.Common.Drag.parasite_drag_wing(equilibrium_state,settings,wing) for fuslage in vehicle.fuselages: RCAIDE.Library.Methods.Aerodynamics.Common.Drag.parasite_drag_fuselage(equilibrium_state,settings,fuslage) for boom in vehicle.booms: RCAIDE.Library.Methods.Aerodynamics.Common.Drag.parasite_drag_fuselage(equilibrium_state,settings,boom) RCAIDE.Library.Methods.Aerodynamics.Common.Drag.parasite_drag_nacelle(equilibrium_state,settings,vehicle) RCAIDE.Library.Methods.Aerodynamics.Common.Drag.parasite_drag_pylon(equilibrium_state,settings,vehicle) RCAIDE.Library.Methods.Aerodynamics.Common.Drag.parasite_total(equilibrium_state,settings,vehicle) RCAIDE.Library.Methods.Aerodynamics.Common.Drag.induced_drag(equilibrium_state,settings,vehicle) RCAIDE.Library.Methods.Aerodynamics.Common.Drag.cooling_drag(equilibrium_state,settings,vehicle) RCAIDE.Library.Methods.Aerodynamics.Common.Drag.compressibility_drag(equilibrium_state,settings,vehicle) RCAIDE.Library.Methods.Aerodynamics.Common.Drag.miscellaneous_drag(equilibrium_state,settings,vehicle) RCAIDE.Library.Methods.Aerodynamics.Common.Drag.form_drag(equilibrium_state,settings,vehicle) RCAIDE.Library.Methods.Aerodynamics.Common.Drag.trim_drag(equilibrium_state,settings,vehicle) RCAIDE.Library.Methods.Aerodynamics.Common.Drag.total_drag(equilibrium_state,settings,vehicle) T_wind2inertial = equilibrium_conditions.frames.wind.transform_to_inertial Cdrag_0 = equilibrium_state.conditions.aerodynamics.coefficients.drag.total Clift_0 = equilibrium_conditions.aerodynamics.coefficients.lift.total CX_0 = orientation_product(T_wind2inertial,Cdrag_0)[:,0][:,None] # -------------------------------------------------------------------------------------------- # Alpha Purtubation # -------------------------------------------------------------------------------------------- pertubation_conditions = create_conditions(n_cpts,alt,g,V,MAC,conditions.energy) pertubation_conditions.aerodynamics.angles.alpha += delta_angle VLM_results = VLM(pertubation_conditions,settings,vehicle) Clift_i_alpha_prime = VLM_results.CLift Cdrag_i_alpha_prime = VLM_results.CDrag_induced CY_alpha_prime = VLM_results.CY CZ_alpha_prime = VLM_results.CZ CL_alpha_prime = VLM_results.CL CM_alpha_prime = VLM_results.CM CN_alpha_prime = VLM_results.CN pertubation_conditions.aerodynamics.coefficients.lift.inviscid.total = Clift_i_alpha_prime pertubation_conditions.aerodynamics.coefficients.lift.inviscid.wings = VLM_results.CLift_wings pertubation_conditions.aerodynamics.coefficients.lift.spanwise = VLM_results.sectional_CLift pertubation_conditions.aerodynamics.coefficients.drag.induced.wings = VLM_results.CDrag_induced_wings pertubation_conditions.aerodynamics.coefficients.drag.induced.total = Cdrag_i_alpha_prime perturbation_state = RCAIDE.Framework.Mission.Common.State() perturbation_state.conditions = pertubation_conditions perturbation_state = RCAIDE.Framework.Mission.Segments.Single_Point.Set_Speed_Set_Altitude() perturbation_state.conditions = pertubation_conditions perturbation_state.state.conditions = pertubation_conditions orientation(perturbation_state) orientations(perturbation_state) RCAIDE.Library.Methods.Aerodynamics.Common.Lift.fuselage_correction(perturbation_state,settings,vehicle) for wing in vehicle.wings: RCAIDE.Library.Methods.Aerodynamics.Common.Drag.parasite_drag_wing(perturbation_state,settings,wing) for fuslage in vehicle.fuselages: RCAIDE.Library.Methods.Aerodynamics.Common.Drag.parasite_drag_fuselage(perturbation_state,settings,fuslage) for boom in vehicle.booms: RCAIDE.Library.Methods.Aerodynamics.Common.Drag.parasite_drag_fuselage(perturbation_state,settings,boom) RCAIDE.Library.Methods.Aerodynamics.Common.Drag.parasite_drag_nacelle(perturbation_state,settings,vehicle) RCAIDE.Library.Methods.Aerodynamics.Common.Drag.parasite_drag_pylon(perturbation_state,settings,vehicle) RCAIDE.Library.Methods.Aerodynamics.Common.Drag.parasite_total(perturbation_state,settings,vehicle) RCAIDE.Library.Methods.Aerodynamics.Common.Drag.induced_drag(perturbation_state,settings,vehicle) RCAIDE.Library.Methods.Aerodynamics.Common.Drag.cooling_drag(perturbation_state,settings,vehicle) RCAIDE.Library.Methods.Aerodynamics.Common.Drag.compressibility_drag(perturbation_state,settings,vehicle) RCAIDE.Library.Methods.Aerodynamics.Common.Drag.miscellaneous_drag(perturbation_state,settings,vehicle) RCAIDE.Library.Methods.Aerodynamics.Common.Drag.trim_drag(perturbation_state,settings,vehicle) RCAIDE.Library.Methods.Aerodynamics.Common.Drag.total_drag(perturbation_state,settings,vehicle) T_wind2inertial = pertubation_conditions.frames.wind.transform_to_inertial Cdrag_visc_prime = perturbation_state.conditions.aerodynamics.coefficients.drag.total Clift_visc_prime = perturbation_state.conditions.aerodynamics.coefficients.lift.total CX_visc_prime = orientation_product(T_wind2inertial,Cdrag_visc_prime)[:,0][:,None] conditions.static_stability.derivatives.Clift_alpha = (Clift_visc_prime - Clift_0) / (delta_angle) conditions.static_stability.derivatives.Cdrag_alpha = (Cdrag_visc_prime - Cdrag_0) / (delta_angle) conditions.static_stability.derivatives.CX_alpha = (CX_visc_prime - CX_0) / (delta_angle) conditions.static_stability.derivatives.CY_alpha = (CY_alpha_prime - CY_0) / (delta_angle) conditions.static_stability.derivatives.CZ_alpha = (CZ_alpha_prime - CZ_0) / (delta_angle) conditions.static_stability.derivatives.CL_alpha = (CL_alpha_prime - CL_0) / (delta_angle) conditions.static_stability.derivatives.CM_alpha = (CM_alpha_prime - CM_0) / (delta_angle) conditions.static_stability.derivatives.CN_alpha = (CN_alpha_prime - CN_0) / (delta_angle) # -------------------------------------------------------------------------------------------- # Beta Purtubation # -------------------------------------------------------------------------------------------- pertubation_conditions = create_conditions(n_cpts,alt,g,V,MAC,conditions.energy) pertubation_conditions.aerodynamics.angles.beta += delta_angle VLM_results = VLM(pertubation_conditions,settings,vehicle) Clift_beta_prime = VLM_results.CLift Cdrag_beta_prime = VLM_results.CDrag_induced CX_beta_prime = VLM_results.CX CY_beta_prime = VLM_results.CY CZ_beta_prime = VLM_results.CZ CL_beta_prime = VLM_results.CL CM_beta_prime = VLM_results.CM CN_beta_prime = VLM_results.CN conditions.static_stability.derivatives.Clift_beta = (Clift_beta_prime - Clift_0) / (delta_angle) conditions.static_stability.derivatives.Cdrag_beta = (Cdrag_beta_prime - Cdrag_0) / (delta_angle) conditions.static_stability.derivatives.CX_beta = (CX_beta_prime - CX_0) / (delta_angle) conditions.static_stability.derivatives.CY_beta = (CY_beta_prime - CY_0) / (delta_angle) conditions.static_stability.derivatives.CZ_beta = (CZ_beta_prime - CZ_0) / (delta_angle) conditions.static_stability.derivatives.CL_beta = (CL_beta_prime - CL_0) / (delta_angle) conditions.static_stability.derivatives.CM_beta = (CM_beta_prime - CM_0) / (delta_angle) conditions.static_stability.derivatives.CN_beta = (CN_beta_prime - CN_0) / (delta_angle) # -------------------------------------------------------------------------------------------- # U-Velocity Pertubation # -------------------------------------------------------------------------------------------- perturbation_state = RCAIDE.Framework.Mission.Common.State() pertubation_conditions = create_conditions(n_cpts,alt,g,V,MAC,conditions.energy) pertubation_conditions.frames.inertial.velocity_vector[:,0] += delta_speed pertubation_conditions.freestream.velocity [:,0] += delta_speed pertubation_conditions.freestream.mach_number = np.linalg.norm(pertubation_conditions.frames.inertial.velocity_vector, axis=1)[:,None] / equilibrium_conditions.freestream.speed_of_sound pertubation_conditions.freestream.reynolds_number = pertubation_conditions.freestream.density * pertubation_conditions.freestream.velocity * wing.chords.mean_aerodynamic/equilibrium_conditions.freestream.dynamic_viscosity pertubation_conditions.freestream.dynamic_pressure = 0.5 * pertubation_conditions.freestream.density * np.sum( pertubation_conditions.freestream.velocity**2, axis=1)[:,None] VLM_results = VLM(pertubation_conditions,settings,vehicle) Clift_i_u_prime = VLM_results.CLift Cdrag_i_u_prime = VLM_results.CDrag_induced CX_u_prime = VLM_results.CX CY_u_prime = VLM_results.CY CZ_u_prime = VLM_results.CZ CL_u_prime = VLM_results.CL CM_u_prime = VLM_results.CM CN_u_prime = VLM_results.CN # Dimensionalize the lift and drag for each wing pertubation_conditions.aerodynamics.coefficients.lift.inviscid.wings = VLM_results.CLift_wings pertubation_conditions.aerodynamics.coefficients.lift.inviscid.total = Clift_i_u_prime pertubation_conditions.aerodynamics.coefficients.drag.induced.total = Cdrag_i_u_prime pertubation_conditions.aerodynamics.coefficients.drag.induced.wings = VLM_results.CDrag_induced_wings pertubation_conditions.aerodynamics.coefficients.lift.spanwise = VLM_results.sectional_CLift perturbation_state = RCAIDE.Framework.Mission.Common.State() perturbation_state.conditions = pertubation_conditions perturbation_state = RCAIDE.Framework.Mission.Segments.Single_Point.Set_Speed_Set_Altitude() perturbation_state.conditions = pertubation_conditions perturbation_state.state.conditions = pertubation_conditions orientation(perturbation_state) orientations(perturbation_state) RCAIDE.Library.Methods.Aerodynamics.Common.Lift.fuselage_correction(perturbation_state,settings,vehicle) for wing in vehicle.wings: RCAIDE.Library.Methods.Aerodynamics.Common.Drag.parasite_drag_wing(perturbation_state,settings,wing) for fuslage in vehicle.fuselages: RCAIDE.Library.Methods.Aerodynamics.Common.Drag.parasite_drag_fuselage(perturbation_state,settings,fuslage) for boom in vehicle.booms: RCAIDE.Library.Methods.Aerodynamics.Common.Drag.parasite_drag_fuselage(perturbation_state,settings,boom) RCAIDE.Library.Methods.Aerodynamics.Common.Drag.parasite_drag_nacelle(perturbation_state,settings,vehicle) RCAIDE.Library.Methods.Aerodynamics.Common.Drag.parasite_drag_pylon(perturbation_state,settings,vehicle) RCAIDE.Library.Methods.Aerodynamics.Common.Drag.parasite_total(perturbation_state,settings,vehicle) RCAIDE.Library.Methods.Aerodynamics.Common.Drag.induced_drag(perturbation_state,settings,vehicle) RCAIDE.Library.Methods.Aerodynamics.Common.Drag.cooling_drag(perturbation_state,settings,vehicle) RCAIDE.Library.Methods.Aerodynamics.Common.Drag.compressibility_drag(perturbation_state,settings,vehicle) RCAIDE.Library.Methods.Aerodynamics.Common.Drag.miscellaneous_drag(perturbation_state,settings,vehicle) RCAIDE.Library.Methods.Aerodynamics.Common.Drag.trim_drag(perturbation_state,settings,vehicle) RCAIDE.Library.Methods.Aerodynamics.Common.Drag.total_drag(perturbation_state,settings,vehicle) T_wind2inertial = pertubation_conditions.frames.wind.transform_to_inertial Cdrag_visc_prime = perturbation_state.conditions.aerodynamics.coefficients.drag.total Clift_visc_prime = perturbation_state.conditions.aerodynamics.coefficients.lift.total CX_visc_prime = orientation_product(T_wind2inertial,Cdrag_visc_prime)[:,0][:,None] conditions.static_stability.derivatives.Clift_u = (Clift_visc_prime - Clift_0) / (delta_speed) conditions.static_stability.derivatives.Cdrag_u = (Cdrag_visc_prime - Cdrag_0) / (delta_speed) conditions.static_stability.derivatives.CX_u = (CX_visc_prime - CX_0) / (delta_speed) conditions.static_stability.derivatives.CY_u = (CY_u_prime - CY_0) / (delta_speed) conditions.static_stability.derivatives.CZ_u = (CZ_u_prime - CZ_0) / (delta_speed) conditions.static_stability.derivatives.CL_u = (CL_u_prime - CL_0) / (delta_speed) conditions.static_stability.derivatives.CM_u = (CM_u_prime - CM_0) / (delta_speed) conditions.static_stability.derivatives.CN_u = (CN_u_prime - CN_0) / (delta_speed) # -------------------------------------------------------------------------------------------- # V-Velocity Pertubation # ------------------------------------------------------------------------------------------- pertubation_conditions = create_conditions(n_cpts,alt,g,V,MAC,conditions.energy) pertubation_conditions.frames.inertial.velocity_vector[:,1] += delta_speed pertubation_conditions.freestream.velocity = np.linalg.norm(pertubation_conditions.frames.inertial.velocity_vector, axis=1)[:,None] pertubation_conditions.freestream.mach_number = pertubation_conditions.freestream.velocity/ pertubation_conditions.freestream.speed_of_sound pertubation_conditions.freestream.reynolds_number = pertubation_conditions.freestream.density * pertubation_conditions.freestream.velocity / pertubation_conditions.freestream.dynamic_viscosity pertubation_conditions.freestream.dynamic_pressure = 0.5 * pertubation_conditions.freestream.density * np.sum( pertubation_conditions.freestream.velocity**2, axis=1)[:,None] VLM_results = VLM(pertubation_conditions,settings,vehicle) Clift_v_prime = VLM_results.CLift Cdrag_v_prime = VLM_results.CDrag_induced CX_v_prime = VLM_results.CX CY_v_prime = VLM_results.CY CZ_v_prime = VLM_results.CZ CL_v_prime = VLM_results.CL CM_v_prime = VLM_results.CM CN_v_prime = VLM_results.CN conditions.static_stability.derivatives.Clift_v = (Clift_v_prime - Clift_0) / (delta_speed) conditions.static_stability.derivatives.Cdrag_v = (Cdrag_v_prime - Cdrag_0) / (delta_speed) conditions.static_stability.derivatives.CX_v = (CX_v_prime - CX_0) / (delta_speed) conditions.static_stability.derivatives.CY_v = (CY_v_prime - CY_0) / (delta_speed) conditions.static_stability.derivatives.CZ_v = (CZ_v_prime - CZ_0) / (delta_speed) conditions.static_stability.derivatives.CL_v = (CL_v_prime - CL_0) / (delta_speed) conditions.static_stability.derivatives.CM_v = (CM_v_prime - CM_0) / (delta_speed) conditions.static_stability.derivatives.CN_v = (CN_v_prime - CN_0) / (delta_speed) # -------------------------------------------------------------------------------------------- # W-Velocity Pertubation # -------------------------------------------------------------------------------------------- pertubation_conditions = create_conditions(n_cpts,alt,g,V,MAC,conditions.energy) pertubation_conditions.frames.inertial.velocity_vector[:,2] += delta_speed pertubation_conditions.freestream.velocity = np.linalg.norm(pertubation_conditions.frames.inertial.velocity_vector, axis=1)[:,None] pertubation_conditions.freestream.mach_number = pertubation_conditions.freestream.velocity / pertubation_conditions.freestream.speed_of_sound pertubation_conditions.freestream.reynolds_number = pertubation_conditions.freestream.density * pertubation_conditions.freestream.velocity / pertubation_conditions.freestream.dynamic_viscosity pertubation_conditions.freestream.dynamic_pressure = 0.5 * pertubation_conditions.freestream.density * np.sum( pertubation_conditions.freestream.velocity**2, axis=1)[:,None] VLM_results = VLM(pertubation_conditions,settings,vehicle) Clift_w_prime = VLM_results.CLift Cdrag_w_prime = VLM_results.CDrag_induced CX_w_prime = VLM_results.CX CY_w_prime = VLM_results.CY CZ_w_prime = VLM_results.CZ CL_w_prime = VLM_results.CL CM_w_prime = VLM_results.CM CN_w_prime = VLM_results.CN conditions.static_stability.derivatives.Clift_w = (Clift_w_prime - Clift_0) / (delta_speed) conditions.static_stability.derivatives.Cdrag_w = (Cdrag_w_prime - Cdrag_0) / (delta_speed) conditions.static_stability.derivatives.CX_w = (CX_w_prime - CX_0) / (delta_speed) conditions.static_stability.derivatives.CY_w = (CY_w_prime - CY_0) / (delta_speed) conditions.static_stability.derivatives.CZ_w = (CZ_w_prime - CZ_0) / (delta_speed) conditions.static_stability.derivatives.CL_w = (CL_w_prime - CL_0) / (delta_speed) conditions.static_stability.derivatives.CM_w = (CM_w_prime - CM_0) / (delta_speed) conditions.static_stability.derivatives.CN_w = (CN_w_prime - CN_0) / (delta_speed) # -------------------------------------------------------------------------------------------- # Roll Rate (p) Purtubation # -------------------------------------------------------------------------------------------- pertubation_conditions = create_conditions(n_cpts,alt,g,V,MAC,conditions.energy) pertubation_conditions.static_stability.roll_rate[:,0] = delta_rate pertubation_conditions.static_stability.pitch_rate[:,0]= 0 pertubation_conditions.static_stability.yaw_rate[:,0] = 0 p_hat = delta_rate * b / (2 * V) VLM_results = VLM(pertubation_conditions,settings,vehicle) Clift_p_prime = VLM_results.CLift Cdrag_p_prime = VLM_results.CDrag_induced CX_p_prime = VLM_results.CX CY_p_prime = VLM_results.CY CZ_p_prime = VLM_results.CZ CL_p_prime = VLM_results.CL CM_p_prime = VLM_results.CM CN_p_prime = VLM_results.CN conditions.static_stability.derivatives.Clift_p = (Clift_p_prime - Clift_0) / (p_hat) conditions.static_stability.derivatives.Cdrag_p = (Cdrag_p_prime - Cdrag_0) / (p_hat) conditions.static_stability.derivatives.CX_p = (CX_p_prime - CX_0) / (p_hat) conditions.static_stability.derivatives.CY_p = (CY_p_prime - CY_0) / (p_hat) conditions.static_stability.derivatives.CZ_p = (CZ_p_prime - CZ_0) / (p_hat) conditions.static_stability.derivatives.CL_p = (CL_p_prime - CL_0) / (p_hat) conditions.static_stability.derivatives.CM_p = (CM_p_prime - CM_0) / (p_hat) conditions.static_stability.derivatives.CN_p = -(CN_p_prime - CN_0) / (p_hat) # --------------------------------------------------------------------------------------------------- # Pitch Rate (q) Purtubation # --------------------------------------------------------------------------------------------------- perturbation_state = RCAIDE.Framework.Mission.Common.State() pertubation_conditions = create_conditions(n_cpts,alt,g,V,MAC,conditions.energy) pertubation_conditions.static_stability.roll_rate[:,0] = 0 pertubation_conditions.static_stability.pitch_rate[:,0] = delta_rate pertubation_conditions.static_stability.yaw_rate[:,0] = 0 q_hat = MAC * delta_rate / (2 * V) VLM_results = VLM(pertubation_conditions,settings,vehicle) Clift_q_prime = VLM_results.CLift Cdrag_q_prime = VLM_results.CDrag_induced CX_q_prime = VLM_results.CX CY_q_prime = VLM_results.CY CZ_q_prime = VLM_results.CZ CL_q_prime = VLM_results.CL CM_q_prime = VLM_results.CM CN_q_prime = VLM_results.CN conditions.static_stability.derivatives.Clift_q = (Clift_q_prime - Clift_0) / (q_hat) conditions.static_stability.derivatives.Cdrag_q = (Cdrag_q_prime - Cdrag_0) / (q_hat) conditions.static_stability.derivatives.CX_q = (CX_q_prime - CX_0) / (q_hat) conditions.static_stability.derivatives.CY_q = (CY_q_prime - CY_0) / (q_hat) conditions.static_stability.derivatives.CZ_q = (CZ_q_prime - CZ_0) / (q_hat) conditions.static_stability.derivatives.CL_q = (CL_q_prime - CL_0) / (q_hat) conditions.static_stability.derivatives.CM_q = (CM_q_prime - CM_0) / (q_hat) conditions.static_stability.derivatives.CN_q = (CN_q_prime - CN_0) / (q_hat) # --------------------------------------------------------------------------------------------------- # Yaw Rate (r) Purtubation # --------------------------------------------------------------------------------------------------- pertubation_conditions = create_conditions(n_cpts,alt,g,V,MAC,conditions.energy) pertubation_conditions.static_stability.roll_rate[:,0] = 0 pertubation_conditions.static_stability.pitch_rate[:,0] = 0 pertubation_conditions.static_stability.yaw_rate[:,0] = delta_rate r_hat = delta_rate * b / (2 * V) VLM_results = VLM(pertubation_conditions,settings,vehicle) Clift_r_prime = VLM_results.CLift Cdrag_r_prime = VLM_results.CDrag_induced CX_r_prime = VLM_results.CX CY_r_prime = VLM_results.CY CZ_r_prime = VLM_results.CZ CL_r_prime = VLM_results.CL CM_r_prime = VLM_results.CM CN_r_prime = VLM_results.CN conditions.static_stability.derivatives.Clift_r = (Clift_r_prime - Clift_0) / (r_hat) conditions.static_stability.derivatives.Cdrag_r = (Cdrag_r_prime - Cdrag_0) / (r_hat) conditions.static_stability.derivatives.CX_r = (CX_r_prime - CX_0) / (r_hat) conditions.static_stability.derivatives.CY_r = (CY_r_prime - CY_0) / (r_hat) conditions.static_stability.derivatives.CZ_r = (CZ_r_prime - CZ_0) / (r_hat) conditions.static_stability.derivatives.CL_r = (CL_r_prime - CL_0) / (r_hat) conditions.static_stability.derivatives.CM_r = (CM_r_prime - CM_0) / (r_hat) conditions.static_stability.derivatives.CN_r = (CN_r_prime - CN_0) / (r_hat) for wing in vehicle.wings: for control_surface in wing.control_surfaces: # only compute derivative if control surface exists pertubation_conditions = create_conditions(n_cpts,alt,g,V,MAC,conditions.energy) if type(control_surface) == RCAIDE.Library.Components.Wings.Control_Surfaces.Aileron: vehicle.wings[wing.tag].control_surfaces.aileron.deflection = delta_ctrl_surf VLM_results = VLM(pertubation_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_delta_a_prime = Clift_res Cdrag_delta_a_prime = Cdrag_res CX_delta_a_prime = CX_res CY_delta_a_prime = CY_res CZ_delta_a_prime = CZ_res CL_delta_a_prime = CL_res CM_delta_a_prime = CM_res CN_delta_a_prime = CN_res dClift_ddelta_a = (Clift_delta_a_prime - Clift_0) / (delta_ctrl_surf) dCdrag_ddelta_a = (Cdrag_delta_a_prime - Cdrag_0) / (delta_ctrl_surf) dCX_ddelta_a = (CX_delta_a_prime - CX_0) / (delta_ctrl_surf) dCY_ddelta_a = (CY_delta_a_prime - CY_0) / (delta_ctrl_surf) dCZ_ddelta_a = (CZ_delta_a_prime - CZ_0) / (delta_ctrl_surf) dCL_ddelta_a = (CL_delta_a_prime - CL_0) / (delta_ctrl_surf) dCM_ddelta_a = (CM_delta_a_prime - CM_0) / (delta_ctrl_surf) dCN_ddelta_a = (CN_delta_a_prime - CN_0) / (delta_ctrl_surf) conditions.static_stability.derivatives.Clift_delta_a = dClift_ddelta_a conditions.static_stability.derivatives.Cdrag_delta_a = dCdrag_ddelta_a conditions.static_stability.derivatives.CX_delta_a = dCX_ddelta_a conditions.static_stability.derivatives.CY_delta_a = dCY_ddelta_a conditions.static_stability.derivatives.CZ_delta_a = dCZ_ddelta_a conditions.static_stability.derivatives.CL_delta_a = dCL_ddelta_a conditions.static_stability.derivatives.CM_delta_a = dCM_ddelta_a conditions.static_stability.derivatives.CN_delta_a = dCN_ddelta_a if type(control_surface) == RCAIDE.Library.Components.Wings.Control_Surfaces.Elevator: vehicle.wings[wing.tag].control_surfaces.elevator.deflection = delta_ctrl_surf VLM_results = VLM(pertubation_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_delta_e_prime = Clift_res Cdrag_delta_e_prime = Cdrag_res CX_delta_e_prime = CX_res CY_delta_e_prime = CY_res CZ_delta_e_prime = CZ_res CL_delta_e_prime = CL_res CM_delta_e_prime = CM_res CN_delta_e_prime = CN_res dClift_ddelta_e = (Clift_delta_e_prime - Clift_0) / (delta_ctrl_surf) dCdrag_ddelta_e = (Cdrag_delta_e_prime - Cdrag_0) / (delta_ctrl_surf) dCX_ddelta_e = (CX_delta_e_prime - CX_0) / (delta_ctrl_surf) dCY_ddelta_e = (CY_delta_e_prime - CY_0) / (delta_ctrl_surf) dCZ_ddelta_e = (CZ_delta_e_prime - CZ_0) / (delta_ctrl_surf) dCL_ddelta_e = (CL_delta_e_prime - CL_0) / (delta_ctrl_surf) dCM_ddelta_e = (CM_delta_e_prime - CM_0) / (delta_ctrl_surf) dCN_ddelta_e = (CN_delta_e_prime - CN_0) / (delta_ctrl_surf) conditions.static_stability.derivatives.Clift_delta_e = dClift_ddelta_e conditions.static_stability.derivatives.Cdrag_delta_e = dCdrag_ddelta_e conditions.static_stability.derivatives.CX_delta_e = dCX_ddelta_e conditions.static_stability.derivatives.CY_delta_e = dCY_ddelta_e conditions.static_stability.derivatives.CZ_delta_e = dCZ_ddelta_e conditions.static_stability.derivatives.CL_delta_e = dCL_ddelta_e conditions.static_stability.derivatives.CM_delta_e = dCM_ddelta_e conditions.static_stability.derivatives.CN_delta_e = dCN_ddelta_e if type(control_surface) == RCAIDE.Library.Components.Wings.Control_Surfaces.Rudder: vehicle.wings[wing.tag].control_surfaces.rudder.deflection = delta_ctrl_surf VLM_results = VLM(pertubation_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_delta_r_prime = Clift_res Cdrag_delta_r_prime = Cdrag_res CX_delta_r_prime = CX_res CY_delta_r_prime = CY_res CZ_delta_r_prime = CZ_res CL_delta_r_prime = CL_res CM_delta_r_prime = CM_res CN_delta_r_prime = CN_res dClift_ddelta_r = (Clift_delta_r_prime - Clift_0) / (delta_ctrl_surf) dCdrag_ddelta_r = (Cdrag_delta_r_prime - Cdrag_0) / (delta_ctrl_surf) dCX_ddelta_r = (CX_delta_r_prime - CX_0) / (delta_ctrl_surf) dCY_ddelta_r = (CY_delta_r_prime - CY_0) / (delta_ctrl_surf) dCZ_ddelta_r = (CZ_delta_r_prime - CZ_0) / (delta_ctrl_surf) dCL_ddelta_r = (CL_delta_r_prime - CL_0) / (delta_ctrl_surf) dCM_ddelta_r = (CM_delta_r_prime - CM_0) / (delta_ctrl_surf) dCN_ddelta_r = (CN_delta_r_prime - CN_0) / (delta_ctrl_surf) conditions.static_stability.derivatives.Clift_delta_r = dClift_ddelta_r conditions.static_stability.derivatives.Cdrag_delta_r = dCdrag_ddelta_r conditions.static_stability.derivatives.CX_delta_r = dCX_ddelta_r conditions.static_stability.derivatives.CY_delta_r = dCY_ddelta_r conditions.static_stability.derivatives.CZ_delta_r = dCZ_ddelta_r conditions.static_stability.derivatives.CL_delta_r = dCL_ddelta_r conditions.static_stability.derivatives.CM_delta_r = dCM_ddelta_r conditions.static_stability.derivatives.CN_delta_r = dCN_ddelta_r if type(control_surface) == RCAIDE.Library.Components.Wings.Control_Surfaces.Flap: vehicle.wings[wing.tag].control_surfaces.flap.deflection = delta_ctrl_surf VLM_results = VLM(pertubation_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_delta_f_prime = Clift_res Cdrag_delta_f_prime = Cdrag_res CX_delta_f_prime = CX_res CY_delta_f_prime = CY_res CZ_delta_f_prime = CZ_res CL_delta_f_prime = CL_res CM_delta_f_prime = CM_res CN_delta_f_prime = CN_res dClift_ddelta_f = (Clift_delta_f_prime - Clift_0) / (delta_ctrl_surf) dCdrag_ddelta_f = (Cdrag_delta_f_prime - Cdrag_0) / (delta_ctrl_surf) dCX_ddelta_f = (CX_delta_f_prime - CX_0) / (delta_ctrl_surf) dCY_ddelta_f = (CY_delta_f_prime - CY_0) / (delta_ctrl_surf) dCZ_ddelta_f = (CZ_delta_f_prime - CZ_0) / (delta_ctrl_surf) dCL_ddelta_f = (CL_delta_f_prime - CL_0) / (delta_ctrl_surf) dCM_ddelta_f = (CM_delta_f_prime - CM_0) / (delta_ctrl_surf) dCN_ddelta_f = (CN_delta_f_prime - CN_0) / (delta_ctrl_surf) conditions.static_stability.derivatives.Clift_delta_f = dClift_ddelta_f conditions.static_stability.derivatives.Clift_delta_f = dCdrag_ddelta_f conditions.static_stability.derivatives.CX_delta_f = dCX_ddelta_f conditions.static_stability.derivatives.CY_delta_f = dCY_ddelta_f conditions.static_stability.derivatives.CZ_delta_f = dCZ_ddelta_f conditions.static_stability.derivatives.CL_delta_f = dCL_ddelta_f conditions.static_stability.derivatives.CM_delta_f = dCM_ddelta_f conditions.static_stability.derivatives.CN_delta_f = dCN_ddelta_f if type(control_surface) == RCAIDE.Library.Components.Wings.Control_Surfaces.Slat: vehicle.wings[wing.tag].control_surfaces.slat.deflection = delta_ctrl_surf VLM_results = VLM(pertubation_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_delta_s_prime = Clift_res Cdrag_delta_s_prime = Cdrag_res CX_delta_s_prime = CX_res CY_delta_s_prime = CY_res CZ_delta_s_prime = CZ_res CL_delta_s_prime = CL_res CM_delta_s_prime = CM_res CN_delta_s_prime = CN_res dClift_ddelta_s = (Clift_delta_s_prime - Clift_0) / (delta_ctrl_surf) dCdrag_ddelta_s = (Cdrag_delta_s_prime - Cdrag_0) / (delta_ctrl_surf) dCX_ddelta_s = (CX_delta_s_prime - CX_0) / (delta_ctrl_surf) dCY_ddelta_s = (CY_delta_s_prime - CY_0) / (delta_ctrl_surf) dCZ_ddelta_s = (CZ_delta_s_prime - CZ_0) / (delta_ctrl_surf) dCL_ddelta_s = (CL_delta_s_prime - CL_0) / (delta_ctrl_surf) dCM_ddelta_s = (CM_delta_s_prime - CM_0) / (delta_ctrl_surf) dCN_ddelta_s = (CN_delta_s_prime - CN_0) / (delta_ctrl_surf) conditions.static_stability.derivatives.Clift_delta_s = dClift_ddelta_s conditions.static_stability.derivatives.Clift_delta_s = dCdrag_ddelta_s conditions.static_stability.derivatives.CX_delta_s = dCX_ddelta_s conditions.static_stability.derivatives.CY_delta_s = dCY_ddelta_s conditions.static_stability.derivatives.CZ_delta_s = dCZ_ddelta_s conditions.static_stability.derivatives.CL_delta_s = dCL_ddelta_s conditions.static_stability.derivatives.CM_delta_s = dCM_ddelta_s conditions.static_stability.derivatives.CN_delta_s = dCN_ddelta_s return
[docs] def create_conditions(n_cpts,altitude,g,V,MAC,energy_conditions): atmosphere = RCAIDE.Framework.Analyses.Atmospheric.US_Standard_1976() atmo_data = atmosphere.compute_values(altitude =altitude) equilibrium_conditions = RCAIDE.Framework.Mission.Common.Results() equilibrium_conditions.expand_rows(n_cpts,override=False) equilibrium_conditions.energy = deepcopy(energy_conditions) equilibrium_conditions.freestream.density[:,0] = atmo_data.density[:,0] equilibrium_conditions.freestream.gravity[:,0] = g[:,0] equilibrium_conditions.freestream.speed_of_sound[:,0] = atmo_data.speed_of_sound[:,0] equilibrium_conditions.freestream.dynamic_viscosity[:,0] = atmo_data.dynamic_viscosity[:,0] equilibrium_conditions.aerodynamics.angles.alpha[:,0] = 1E-12 equilibrium_conditions.freestream.temperature[:,0] = atmo_data.temperature[:,0] equilibrium_conditions.freestream.velocity[:,0] = V[:,0] equilibrium_conditions.frames.inertial.velocity_vector[:,0] = equilibrium_conditions.freestream.velocity[:,0] equilibrium_conditions.freestream.mach_number = equilibrium_conditions.freestream.velocity/equilibrium_conditions.freestream.speed_of_sound equilibrium_conditions.freestream.dynamic_pressure = 0.5 * equilibrium_conditions.freestream.density * (equilibrium_conditions.freestream.velocity ** 2) equilibrium_conditions.freestream.reynolds_number = equilibrium_conditions.freestream.density * equilibrium_conditions.freestream.velocity * MAC/ equilibrium_conditions.freestream.dynamic_viscosity return equilibrium_conditions
[docs] def compute_stability_derivative(sub_sur,trans_sur,sup_sur,h_sub,h_sup,Mach): if trans_sur == None and sup_sur == None: derivative = h_sub(Mach)*sub_sur(Mach) return derivative derivative = h_sub(Mach)*sub_sur(Mach) + (1 - (h_sup(Mach) + h_sub(Mach)))*trans_sur(Mach) + h_sup(Mach)*sup_sur(Mach) return derivative
[docs] def compute_coefficients(sub_sur_Clift,sub_sur_Cdrag,sub_sur_CX,sub_sur_CY,sub_sur_CZ,sub_sur_CL,sub_sur_CM,sub_sur_CN, trans_sur_Clift,trans_sur_Cdrag,trans_sur_CX,trans_sur_CY,trans_sur_CZ,trans_sur_CL,trans_sur_CM,trans_sur_CN, sup_sur_Clift,sup_sur_Cdrag,sup_sur_CX,sup_sur_CY,sup_sur_CZ,sup_sur_CL,sup_sur_CM,sup_sur_CN, sub_sur_cl_spanwise, trans_sur_cl_spanwise, sup_sur_cl_spanwise, h_sub,h_sup,Mach, pts): # subsonic sub_Clift = np.atleast_2d(sub_sur_Clift(pts)).T sub_Cdrag = np.atleast_2d(sub_sur_Cdrag(pts)).T sub_CX = np.atleast_2d(sub_sur_CX(pts)).T sub_CY = np.atleast_2d(sub_sur_CY(pts)).T sub_CZ = np.atleast_2d(sub_sur_CZ(pts)).T sub_CL = np.atleast_2d(sub_sur_CL(pts)).T sub_CM = np.atleast_2d(sub_sur_CM(pts)).T sub_CN = np.atleast_2d(sub_sur_CN(pts)).T sub_Clift_y = sub_sur_cl_spanwise(pts) if trans_sur_Clift == None and sup_sur_Clift == None: results = Data() results.Clift = h_sub(Mach) * sub_Clift results.Cdrag = h_sub(Mach) * sub_Cdrag results.CX = h_sub(Mach) * sub_CX results.CY = h_sub(Mach) * sub_CY results.CZ = h_sub(Mach) * sub_CZ results.CL = h_sub(Mach) * sub_CL results.CM = h_sub(Mach) * sub_CM results.CN = h_sub(Mach) * sub_CN results.Clift_spanwise = h_sub(Mach)*sub_Clift_y return results # transonic trans_Clift = np.atleast_2d(trans_sur_Clift(pts)).T trans_Cdrag = np.atleast_2d(trans_sur_Cdrag(pts)).T trans_CX = np.atleast_2d(trans_sur_CX(pts)).T trans_CY = np.atleast_2d(trans_sur_CY(pts)).T trans_CZ = np.atleast_2d(trans_sur_CZ(pts)).T trans_CL = np.atleast_2d(trans_sur_CL(pts)).T trans_CM = np.atleast_2d(trans_sur_CM(pts)).T trans_CN = np.atleast_2d(trans_sur_CN(pts)).T trans_Clift_y = trans_sur_cl_spanwise(pts) # supersonic sup_Clift = np.atleast_2d(sup_sur_Clift(pts)).T sup_Cdrag = np.atleast_2d(sup_sur_Cdrag(pts)).T sup_CX = np.atleast_2d(sup_sur_CX(pts)).T sup_CY = np.atleast_2d(sup_sur_CY(pts)).T sup_CZ = np.atleast_2d(sup_sur_CZ(pts)).T sup_CL = np.atleast_2d(sup_sur_CL(pts)).T sup_CM = np.atleast_2d(sup_sur_CM(pts)).T sup_CN = np.atleast_2d(sup_sur_CN(pts)).T sup_Clift_y = sup_sur_cl_spanwise(pts) # apply results = Data() results.Clift = h_sub(Mach)*sub_Clift + (1 - (h_sup(Mach) + h_sub(Mach)))*trans_Clift + h_sup(Mach)*sup_Clift results.Cdrag = h_sub(Mach)*sub_Cdrag + (1 - (h_sup(Mach) + h_sub(Mach)))*trans_Cdrag + h_sup(Mach)*sup_Cdrag results.CX = h_sub(Mach)*sub_CX + (1 - (h_sup(Mach) + h_sub(Mach)))*trans_CX + h_sup(Mach)*sup_CX results.CY = h_sub(Mach)*sub_CY + (1 - (h_sup(Mach) + h_sub(Mach)))*trans_CY + h_sup(Mach)*sup_CY results.CZ = h_sub(Mach)*sub_CZ + (1 - (h_sup(Mach) + h_sub(Mach)))*trans_CZ + h_sup(Mach)*sup_CZ results.CL = h_sub(Mach)*sub_CL + (1 - (h_sup(Mach) + h_sub(Mach)))*trans_CL + h_sup(Mach)*sup_CL results.CM = h_sub(Mach)*sub_CM + (1 - (h_sup(Mach) + h_sub(Mach)))*trans_CM + h_sup(Mach)*sup_CM results.CN = h_sub(Mach)*sub_CN + (1 - (h_sup(Mach) + h_sub(Mach)))*trans_CN + h_sup(Mach)*sup_CN results.Clift_spanwise = h_sub(Mach)*sub_Clift_y + (1 - (h_sup(Mach) + h_sub(Mach)))*trans_Clift_y + h_sup(Mach)*sup_Clift_y return results