Source code for RCAIDE.Library.Methods.Performance.aircraft_aerodynamic_analysis
# RCAIDE/Methods/Performance/aircraft_aerodynamic_analysis.py
#
#
# Created: Dec 2024, M. Clarke
# ----------------------------------------------------------------------------------------------------------------------
# IMPORT
# ----------------------------------------------------------------------------------------------------------------------
# RCAIDE imports
import RCAIDE
from RCAIDE.Framework.Core import Data
# Pacakge imports
import numpy as np
#------------------------------------------------------------------------------
# aircraft_aerodynamic_analysis
#------------------------------------------------------------------------------
[docs]
def aircraft_aerodynamic_analysis(aerodynamics_analysis = None,
angle_of_attack_range = None,
Mach_number_range= None,
control_surface_deflection_range = np.array([[0]]),
altitude = 0,
delta_ISA=0):
"""
Computes aerodynamic coefficients across ranges of angle of attack and Mach numbers using vortex lattice methods.
Parameters
--------
vehicle : Vehicle
The vehicle instance to be analyzed
angle_of_attack_range : ndarray
Array of angle of attack values to evaluate [radians]
Mach_number_range : ndarray
Array of Mach numbers to evaluate
control_surface_deflection_range : ndarray, optional
Array of control surface deflection angles [radians], default [[0]]
altitude : float, optional
Altitude for atmospheric properties [m], default 0
delta_ISA : float, optional
Temperature offset from ISA conditions [K], default 0
use_surrogate : bool, optional
Flag for using surrogate model in analysis, default True
model_fuselage : bool, optional
Flag for including fuselage effects, default True. Of note, fuselage modeling can
sometimes be difficult for VLM solvers.
Returns
--------
results : Data
Container of analysis results including:
* Mach : ndarray
Evaluated Mach numbers
* alpha : ndarray
Evaluated angles of attack [rad]
* lift_coefficient : ndarray
Computed lift coefficients
* drag_coefficient : ndarray
Computed drag coefficients
Notes
-----
The function uses the US Standard Atmosphere 1976 model for atmospheric properties
and evaluates aerodynamic coefficients using vortex lattice methods. Can use a surrogate model
for faster evaluation or just direct evaluation of the aerodynamics.
**Major Assumptions**
* Flow is steady and inviscid
* Small angle approximations apply
* Linear aerodynamics
* Atmospheric properties follow US Standard Atmosphere 1976
See Also
--------
RCAIDE.Library.Methods.Aerodynamics.Vortex_Lattice_Method
RCAIDE.Library.Attributes.Atmospheres.Earth.US_Standard_1976
"""
#------------------------------------------------------------------------
# setup flight conditions
#------------------------------------------------------------------------
atmosphere = RCAIDE.Framework.Analyses.Atmospheric.US_Standard_1976()
atmo_data = atmosphere.compute_values(altitude,delta_ISA)
P = atmo_data.pressure
T = atmo_data.temperature
rho = atmo_data.density
a = atmo_data.speed_of_sound
mu = atmo_data.dynamic_viscosity
# -----------------------------------------------------------------
# Evaluate Without Surrogate
# -----------------------------------------------------------------
ctrl_pts = len(angle_of_attack_range[:, 0] )
state = RCAIDE.Framework.Mission.Common.State()
state.conditions = RCAIDE.Framework.Mission.Common.Results()
state.conditions.freestream.density = rho * np.ones_like(angle_of_attack_range)
state.conditions.freestream.dynamic_viscosity = mu * np.ones_like(angle_of_attack_range)
state.conditions.freestream.temperature = T * np.ones_like(angle_of_attack_range)
state.conditions.freestream.pressure = P * np.ones_like(angle_of_attack_range)
state.conditions.aerodynamics.angles.alpha = angle_of_attack_range
state.conditions.aerodynamics.angles.beta = angle_of_attack_range *0
state.conditions.freestream.u = angle_of_attack_range *0
state.conditions.freestream.v = angle_of_attack_range *0
state.conditions.freestream.w = angle_of_attack_range *0
state.conditions.static_stability.roll_rate = angle_of_attack_range *0
state.conditions.static_stability.pitch_rate = angle_of_attack_range *0
state.conditions.static_stability.yaw_rate = angle_of_attack_range *0
state.conditions.expand_rows(ctrl_pts)
CL_vals = np.zeros((len(angle_of_attack_range),len(Mach_number_range)))
CD_vals = np.zeros((len(angle_of_attack_range),len(Mach_number_range)))
state.analyses = Data()
aerodynamics_analysis.initialize()
state.analyses.aerodynamics = aerodynamics_analysis
for i in range (len(Mach_number_range)):
state.conditions.freestream.mach_number = Mach_number_range[i, 0] * np.ones_like(angle_of_attack_range)
state.conditions.freestream.velocity = Mach_number_range[i, 0] * a * np.ones_like(angle_of_attack_range)
state.conditions.freestream.reynolds_number = state.conditions.freestream.density * state.conditions.freestream.velocity / state.conditions.freestream.dynamic_viscosity
state.conditions.frames.inertial.velocity_vector[:,0] = Mach_number_range[i, 0] * a[0, 0] * angle_of_attack_range[:, 0]
# ---------------------------------------------------------------------------------------
# Evaluate With Surrogate
# ---------------------------------------------------------------------------------------
_ = state.analyses.aerodynamics.evaluate(state)
CL_vals[:,i] = state.conditions.aerodynamics.coefficients.lift.total[:, 0]
CD_vals[:,i] = state.conditions.aerodynamics.coefficients.drag.total[:, 0]
results = Data(
Mach = Mach_number_range,
alpha = angle_of_attack_range,
lift_coefficient = CL_vals,
drag_coefficient = CD_vals,
)
return results