Source code for RCAIDE.Library.Methods.Aerodynamics.Athena_Vortex_Lattice.translate_data
# RCAIDE/Library/Methods/Aerodynamics/Athena_Vortex_Lattice/translate_data.py
#
# Created: Oct 2024, M. Clarke
# ----------------------------------------------------------------------------------------------------------------------
# IMPORT
# ----------------------------------------------------------------------------------------------------------------------
# RCAIDE imports
from RCAIDE.Framework.Core import Units
from .AVL_Objects.Run_Case import Run_Case
# package imports
import numpy as np
# ----------------------------------------------------------------------------------------------------------------------
# translate_data
# ----------------------------------------------------------------------------------------------------------------------
[docs]
def translate_conditions_to_cases(avl ,conditions):
""" Takes RCAIDE Conditions() data structure and translates to a Container of
avl Run_Case()s.
Assumptions:
None
Source:
Drela, M. and Youngren, H., AVL, http://web.mit.edu/drela/Public/web/avl
Inputs:
conditions.aerodynamics.angles.alpha [radians]
conditions.freestream.mach_number [-]
conditions.freestream.density [kilograms per meters**3]
conditions.freestream.gravity [meters per second**2]
Outputs:
cases [data structur]
Properties Used:
N/A
"""
# set up aerodynamic Conditions object
aircraft = avl.vehicle
cases = Run_Case.Container()
for i in range(len(conditions.aerodynamics.angles.alpha)):
case = Run_Case()
case.tag = avl.settings.filenames.case_template.format(avl.current_status.batch_index,i+1)
case.mass = conditions.weights.total_mass
case.conditions.freestream.mach = conditions.freestream.mach_number[i, 0]
case.conditions.freestream.density = conditions.freestream.density[i, 0]
case.conditions.freestream.gravitational_acceleration = conditions.freestream.gravity[i, 0]
case.conditions.aerodynamics.angles.alpha = conditions.aerodynamics.angles.alpha[i, 0]/Units.deg
case.conditions.aerodynamics.angles.beta = conditions.aerodynamics.angles.beta[i, 0]/Units.deg
if type(conditions.aerodynamics.coefficients.lift.total) == np.ndarray:
case.conditions.aerodynamics.coefficients.lift.total= conditions.aerodynamics.coefficients.lift.total[i, 0]
else:
case.conditions.aerodynamics.coefficients.lift.total = None
case.conditions.static_stability.coefficients.roll = conditions.static_stability.coefficients.roll[i, 0]
case.conditions.static_stability.coefficients.pitch = conditions.static_stability.coefficients.pitch[i, 0]
# determine the number of wings
n_wings = 0
for wing in aircraft.wings:
n_wings += 1
if wing.symmetric == True:
n_wings += 1
case.num_wings = n_wings
case.n_sw = avl.settings.number_of_spanwise_vortices
cases.append_case(case)
return cases
[docs]
def translate_results_to_conditions(cases,res,results):
""" Takes avl results structure containing the results of each run case stored
each in its own Data() object. Translates into the Conditions() data structure.
Assumptions:
None
Source:
Drela, M. and Youngren, H., AVL, http://web.mit.edu/drela/Public/web/avl
Inputs:
case_res = results
Outputs:
cases [data_structure]
Properties Used:
N/A
"""
num_wings = cases[0].num_wings
n_sw = cases[0].n_sw
dim = len(cases)
# aero results 1: total surface forces and coefficeints
res.aerodynamics.coefficients.lift.total = np.zeros((dim,1))
res.aerodynamics.wing_areas = np.zeros((dim,num_wings))
res.aerodynamics.wing_CLs = np.zeros_like(res.aerodynamics.wing_areas)
res.aerodynamics.wing_CDs = np.zeros_like(res.aerodynamics.wing_areas)
# aero results 2 : sectional forces and coefficients
res.aerodynamics.wing_local_spans = np.zeros((dim,num_wings,n_sw))
res.aerodynamics.wing_section_chords = np.zeros_like(res.aerodynamics.wing_local_spans)
res.aerodynamics.wing_section_cls = np.zeros_like(res.aerodynamics.wing_local_spans)
res.aerodynamics.wing_section_induced_angle = np.zeros_like(res.aerodynamics.wing_local_spans)
res.aerodynamics.wing_section_cds = np.zeros_like(res.aerodynamics.wing_local_spans)
res.static_stability.control_surfaces_cases = {}
mach_case = list(results.keys())[0][5:9]
for i in range(len(results.keys())):
aoa_case = '{:04d}'.format(i+1)
tag = 'case_' + mach_case + '_' + aoa_case
case_res = results[tag]
# stability file
res.S_ref[i][0] = case_res.S_ref
res.c_ref[i][0] = case_res.c_ref
res.b_ref[i][0] = case_res.b_ref
res.X_ref[i][0] = case_res.X_ref
res.Y_ref[i][0] = case_res.Y_ref
res.Z_ref[i][0] = case_res.Z_ref
res.aerodynamics.angles.alpha[i][0] = case_res.aerodynamics.AoA * Units.degree
res.aerodynamics.angles.beta[i][0] = case_res.aerodynamics.beta * Units.degree
res.static_stability.coefficients.X[i][0] = case_res.aerodynamics.CX
res.static_stability.coefficients.Y[i][0] = case_res.aerodynamics.CY
res.static_stability.coefficients.Z[i][0] = case_res.aerodynamics.CZ
res.static_stability.coefficients.L[i][0] = case_res.aerodynamics.Cltot
res.static_stability.coefficients.M[i][0] = case_res.aerodynamics.Cmtot
res.static_stability.coefficients.N[i][0] = case_res.aerodynamics.Cntot
res.static_stability.coefficients.roll[i][0] = case_res.aerodynamics.roll_moment_coefficient
res.static_stability.coefficients.pitch[i][0] = case_res.aerodynamics.pitch_moment_coefficient
res.static_stability.coefficients.yaw[i][0] = case_res.aerodynamics.yaw_moment_coefficient
res.aerodynamics.coefficients.lift.total[i][0] = case_res.aerodynamics.total_lift_coefficient
res.aerodynamics.coefficients.drag.induced.inviscid[i][0] = case_res.aerodynamics.induced_drag_coefficient
res.aerodynamics.coefficients.drag.induced.efficiency_factor[i][0] = case_res.aerodynamics.oswald_efficiency
res.aerodynamics.oswald_efficiency[i][0] = case_res.aerodynamics.oswald_efficiency
res.static_stability.derivatives.Clift_alpha[i][0] = case_res.stability.alpha_derivatives.lift_curve_slope
res.static_stability.derivatives.CY_alpha[i][0] = case_res.stability.alpha_derivatives.side_force_derivative
res.static_stability.derivatives.CL_alpha[i][0] = case_res.stability.alpha_derivatives.roll_moment_derivative
res.static_stability.derivatives.CM_alpha[i][0] = case_res.stability.alpha_derivatives.pitch_moment_derivative
res.static_stability.derivatives.CN_alpha[i][0] = case_res.stability.alpha_derivatives.yaw_moment_derivative
res.static_stability.derivatives.Clift_beta[i][0] = case_res.stability.beta_derivatives.lift_coefficient_derivative
res.static_stability.derivatives.CY_beta[i][0] = case_res.stability.beta_derivatives.side_force_derivative
res.static_stability.derivatives.CL_beta[i][0] = case_res.stability.beta_derivatives.roll_moment_derivative
res.static_stability.derivatives.CM_beta[i][0] = case_res.stability.beta_derivatives.pitch_moment_derivative
res.static_stability.derivatives.CN_beta[i][0] = case_res.stability.beta_derivatives.yaw_moment_derivative
res.static_stability.derivatives.Clift_p[i][0] = case_res.stability.CL_p
res.static_stability.derivatives.Clift_q[i][0] = case_res.stability.CL_q
res.static_stability.derivatives.Clift_r[i][0] = case_res.stability.CL_r
res.static_stability.derivatives.CY_p[i][0] = case_res.stability.CY_p
res.static_stability.derivatives.CY_q[i][0] = case_res.stability.CY_q
res.static_stability.derivatives.CY_r[i][0] = case_res.stability.CY_r
res.static_stability.derivatives.CL_p[i][0] = case_res.stability.Cl_p
res.static_stability.derivatives.CL_q[i][0] = case_res.stability.Cl_q
res.static_stability.derivatives.CL_r[i][0] = case_res.stability.Cl_r
res.static_stability.derivatives.CM_p[i][0] = case_res.stability.Cm_p
res.static_stability.derivatives.CM_q[i][0] = case_res.stability.Cm_q
res.static_stability.derivatives.CM_r[i][0] = case_res.stability.Cm_r
res.static_stability.derivatives.CN_p[i][0] = case_res.stability.Cn_p
res.static_stability.derivatives.CN_q[i][0] = case_res.stability.Cn_q
res.static_stability.derivatives.CN_r[i][0] = case_res.stability.Cn_r
res.static_stability.derivatives.CX_u[i][0] = case_res.stability.CX_u
res.static_stability.derivatives.CX_v[i][0] = case_res.stability.CX_v
res.static_stability.derivatives.CX_w[i][0] = case_res.stability.CX_w
res.static_stability.derivatives.CY_u[i][0] = case_res.stability.CY_u
res.static_stability.derivatives.CY_v[i][0] = case_res.stability.CY_v
res.static_stability.derivatives.CY_w[i][0] = case_res.stability.CY_w
res.static_stability.derivatives.CZ_u[i][0] = case_res.stability.CZ_u
res.static_stability.derivatives.CZ_v[i][0] = case_res.stability.CZ_v
res.static_stability.derivatives.CZ_w[i][0] = case_res.stability.CZ_w
res.static_stability.derivatives.CL_u[i][0] = case_res.stability.Cl_u
res.static_stability.derivatives.CL_v[i][0] = case_res.stability.Cl_v
res.static_stability.derivatives.CL_w[i][0] = case_res.stability.Cl_w
res.static_stability.derivatives.CM_u[i][0] = case_res.stability.Cm_u
res.static_stability.derivatives.CM_v[i][0] = case_res.stability.Cm_v
res.static_stability.derivatives.CM_w[i][0] = case_res.stability.Cm_w
res.static_stability.derivatives.CN_u[i][0] = case_res.stability.Cn_u
res.static_stability.derivatives.CN_v[i][0] = case_res.stability.Cn_v
res.static_stability.derivatives.CN_w[i][0] = case_res.stability.Cn_w
res.static_stability.derivatives.CX_p[i][0] = case_res.stability.CX_p
res.static_stability.derivatives.CX_q[i][0] = case_res.stability.CX_q
res.static_stability.derivatives.CX_r[i][0] = case_res.stability.CX_r
res.static_stability.derivatives.CY_p[i][0] = case_res.stability.CY_p
res.static_stability.derivatives.CY_q[i][0] = case_res.stability.CY_q
res.static_stability.derivatives.CY_r[i][0] = case_res.stability.CY_r
res.static_stability.derivatives.CZ_p[i][0] = case_res.stability.CZ_p
res.static_stability.derivatives.CZ_q[i][0] = case_res.stability.CZ_q
res.static_stability.derivatives.CZ_r[i][0] = case_res.stability.CZ_r
res.static_stability.neutral_point[i][0] = case_res.stability.neutral_point
res.static_stability.spiral_criteria[i][0] = case_res.stability.spiral_criteria
# aero surface forces file
res.aerodynamics.wing_areas[i][:] = case_res.aerodynamics.wing_areas
res.aerodynamics.wing_CLs[i][:] = case_res.aerodynamics.wing_CLs
res.aerodynamics.wing_CDs[i][:] = case_res.aerodynamics.wing_CDs
# aero sectional forces file
res.aerodynamics.wing_local_spans[i][:] = case_res.aerodynamics.wing_local_spans
res.aerodynamics.wing_section_chords[i][:] = case_res.aerodynamics.wing_section_chords
res.aerodynamics.wing_section_cls[i][:] = case_res.aerodynamics.wing_section_cls
res.aerodynamics.wing_section_induced_angle[i][:] = case_res.aerodynamics.wing_section_aoa_i
res.aerodynamics.wing_section_cds[i][:] = case_res.aerodynamics.wing_section_cds
res.static_stability.control_surfaces_cases[tag] = case_res.stability.control_surfaces
if len(res.static_stability.coefficients.X) > 1:
res.static_stability.derivatives.CX_alpha[:, 0] = np.gradient( res.static_stability.coefficients.X[:, 0],res.aerodynamics.angles.alpha[:, 0] )
res.static_stability.derivatives.CZ_alpha[:, 0] = np.gradient( res.static_stability.coefficients.Z[:, 0],res.aerodynamics.angles.alpha[:, 0] )
return