Source code for RCAIDE.Library.Methods.Aerodynamics.Athena_Vortex_Lattice.read_results
# RCAIDE/Library/Methods/Aerodynamics/Athena_Vortex_Lattice/read_results.py
#
# Created: Oct 2024, M. Clarke
# ----------------------------------------------------------------------------------------------------------------------
# IMPORT
# ----------------------------------------------------------------------------------------------------------------------
from RCAIDE.Framework.Core import Data
from RCAIDE.Library.Methods.Aerodynamics.Athena_Vortex_Lattice.AVL_Objects.Wing import Control_Surface_Data , Control_Surface_Results
# package imports
import numpy as np
# ----------------------------------------------------------------------------------------------------------------------
# read_results
# ----------------------------------------------------------------------------------------------------------------------
[docs]
def read_results(avl_object):
""" This functions reads the results from the results text file created
at the end of an AVL function call
Assumptions:
None
Source:
Drela, M. and Youngren, H., AVL, http://web.mit.edu/drela/Public/web/avl
Inputs:
None
Outputs:
results
Properties Used:
N/A
"""
# unpack
aircraft = avl_object.vehicle
results = Data()
for case in avl_object.current_status.cases:
num_ctrl = case.stability_and_control.number_of_control_surfaces
# open newly written result files and read in aerodynamic properties
with open(case.aero_result_filename_1,'r') as stab_der_vile:
# Extract results from stability axis derivatives file
case_res = Data()
case_res.aerodynamics = Data()
case_res.stability = Data()
case_res.stability.control_surfaces = Control_Surface_Data()
case_res.stability.alpha_derivatives = Data()
case_res.stability.beta_derivatives = Data()
case_res.tag = case.tag
lines = stab_der_vile.readlines()
case_res.S_ref = float(lines[8][10:16].strip())
case_res.c_ref = float(lines[8][31:37].strip())
case_res.b_ref = float(lines[8][52:58].strip())
case_res.X_ref = float(lines[9][10:16].strip())
case_res.Y_ref = float(lines[9][31:37].strip())
case_res.Z_ref = float(lines[9][52:58].strip())
case_res.aerodynamics.AoA = float(lines[15][10:19].strip())
case_res.aerodynamics.beta = float(lines[16][10:19].strip())
case_res.aerodynamics.CX = float(lines[19][11:19].strip())
case_res.aerodynamics.CY = float(lines[20][11:19].strip())
case_res.aerodynamics.CZ = float(lines[21][11:19].strip())
case_res.aerodynamics.Cltot = float(lines[19][33:41].strip())
case_res.aerodynamics.Cmtot = float(lines[20][33:41].strip())
case_res.aerodynamics.Cntot = float(lines[21][33:41].strip())
case_res.aerodynamics.roll_moment_coefficient = float(lines[19][32:42].strip())
case_res.aerodynamics.pitch_moment_coefficient = float(lines[20][32:42].strip())
case_res.aerodynamics.yaw_moment_coefficient = float(lines[21][32:42].strip())
case_res.aerodynamics.total_lift_coefficient = float(lines[23][10:20].strip())
case_res.aerodynamics.total_drag_coefficient = float(lines[24][10:20].strip())
case_res.aerodynamics.viscous_drag_coefficient = float(lines[25][10:20].strip())
case_res.aerodynamics.induced_drag_coefficient = float(lines[25][32:42].strip())
case_res.aerodynamics.oswald_efficiency = float(lines[27][32:42].strip())
case_res.stability.alpha_derivatives.lift_curve_slope = float(lines[36+num_ctrl][24:34].strip()) # CL_a
case_res.stability.alpha_derivatives.side_force_derivative = float(lines[37+num_ctrl][24:34].strip()) # CY_a
case_res.stability.alpha_derivatives.roll_moment_derivative = float(lines[38+num_ctrl][24:34].strip()) # Cl_a
case_res.stability.alpha_derivatives.pitch_moment_derivative = float(lines[39+num_ctrl][24:34].strip()) # Cm_a
case_res.stability.alpha_derivatives.yaw_moment_derivative = float(lines[40+num_ctrl][24:34].strip()) # Cn_a
case_res.stability.beta_derivatives.lift_coefficient_derivative = float(lines[36+num_ctrl][43:54].strip()) # CL_b
case_res.stability.beta_derivatives.side_force_derivative = float(lines[37+num_ctrl][43:54].strip()) # CY_b
case_res.stability.beta_derivatives.roll_moment_derivative = float(lines[38+num_ctrl][43:54].strip()) # Cl_b
case_res.stability.beta_derivatives.pitch_moment_derivative = float(lines[39+num_ctrl][43:54].strip()) # Cm_b
case_res.stability.beta_derivatives.yaw_moment_derivative = float(lines[40+num_ctrl][43:54].strip()) # Cn_b
case_res.stability.CL_p = float(lines[44+num_ctrl][24:34].strip())
case_res.stability.CL_q = float(lines[44+num_ctrl][43:54].strip())
case_res.stability.CL_r = float(lines[44+num_ctrl][65:74].strip())
case_res.stability.CY_p = float(lines[45+num_ctrl][24:34].strip())
case_res.stability.CY_q = float(lines[45+num_ctrl][43:54].strip())
case_res.stability.CY_r = float(lines[45+num_ctrl][65:74].strip())
case_res.stability.Cl_p = float(lines[46+num_ctrl][24:34].strip())
case_res.stability.Cl_q = float(lines[46+num_ctrl][43:54].strip())
case_res.stability.Cl_r = float(lines[46+num_ctrl][65:74].strip())
case_res.stability.Cm_p = float(lines[47+num_ctrl][24:34].strip())
case_res.stability.Cm_q = float(lines[47+num_ctrl][43:54].strip())
case_res.stability.Cm_r = float(lines[44+num_ctrl][65:74].strip())
case_res.stability.Cn_p = float(lines[48+num_ctrl][24:34].strip())
case_res.stability.Cn_q = float(lines[48+num_ctrl][43:54].strip())
case_res.stability.Cn_r = float(lines[48+num_ctrl][65:74].strip())
# this block of text reads in aerodynamic results related to the defined control surfaces
if num_ctrl != 0:
for ctrl_idx in range(num_ctrl):
ctrl_surf = Control_Surface_Results()
ctrl_surf.tag = str(lines[29+ctrl_idx][2:11].strip())
ctrl_surf.deflection = float(lines[29+ctrl_idx][21:32].strip())
ctrl_surf.CL = float(lines[52+num_ctrl][(20*ctrl_idx + 23):(20*ctrl_idx + 34)].strip())
ctrl_surf.CY = float(lines[53+num_ctrl][(20*ctrl_idx + 23):(20*ctrl_idx + 34)].strip())
ctrl_surf.Cl = float(lines[54+num_ctrl][(20*ctrl_idx + 23):(20*ctrl_idx + 34)].strip())
ctrl_surf.Cm = float(lines[55+num_ctrl][(20*ctrl_idx + 23):(20*ctrl_idx + 34)].strip())
ctrl_surf.Cn = float(lines[56+num_ctrl][(20*ctrl_idx + 23):(20*ctrl_idx + 34)].strip())
ctrl_surf.CDff = float(lines[57+num_ctrl][(20*ctrl_idx + 23):(20*ctrl_idx + 34)].strip())
ctrl_surf.e = float(lines[58+num_ctrl][(20*ctrl_idx + 23):(20*ctrl_idx + 34)].strip())
case_res.stability.control_surfaces.append_control_surface_result(ctrl_surf)
case_res.stability.neutral_point = float(lines[50+12*(num_ctrl>0)+num_ctrl][22:33].strip())
case_res.stability.spiral_criteria = float(lines[52+12*(num_ctrl>0)+num_ctrl][22:33].strip())
# get number of wings, spanwise discretization for surface and strip force result extraction
n_sw = avl_object.settings.number_of_spanwise_vortices
n_wings = 0
for wing in aircraft.wings:
n_wings += 1
if wing.symmetric:
n_wings += 1
n_fus_sec = 0
for fuselage in aircraft.fuselages:
if avl_object.settings.model_fuselage:
n_fus_sec += 2
wing_area = np.zeros(n_wings)
wing_CL = np.zeros(n_wings)
wing_CD = np.zeros(n_wings)
wing_local_span = np.zeros((n_wings,n_sw))
wing_sectional_chord = np.zeros((n_wings,n_sw))
wing_cl = np.zeros((n_wings,n_sw))
alpha_i = np.zeros((n_wings,n_sw))
wing_cd = np.zeros((n_wings,n_sw))
# Extract resulst from surface forces result file
with open(case.aero_result_filename_2,'r') as aero_res_file:
aero_lines = aero_res_file.readlines()
line_idx = 0
header = 12 + n_wings + n_fus_sec
for i in range(n_wings):
wing_area[i] = float(aero_lines[header + line_idx][7:14].strip())
wing_CL[i] = float(aero_lines[header + line_idx][26:32].strip())
wing_CD[i] = float(aero_lines[header + line_idx][35:41].strip())
line_idx += 1
case_res.aerodynamics.wing_areas = wing_area
case_res.aerodynamics.wing_CLs = wing_CL
case_res.aerodynamics.wing_CDs = wing_CD
# Extract resulst from strip forces result file
with open(case.aero_result_filename_3,'r') as aero_res_file_2:
aero_lines_2 = aero_res_file_2.readlines()
line_idx = 0
header = 20
divider_header = 15
for i in range(n_wings):
for j in range(n_sw):
wing_local_span[i,j] = float(aero_lines_2[header + j + line_idx][8:16].strip())
wing_sectional_chord[i,j] = float(aero_lines_2[header + j + line_idx][16:24].strip())
wing_cl[i,j] = float(aero_lines_2[header + j + line_idx][61:69].strip())
# At high angle of attacks, AVL does not give an answer
try:
alpha_i[i,j] = float(aero_lines_2[header + j + line_idx][43:51].strip())
wing_cd[i,j] = float(aero_lines_2[header + j + line_idx][70:78].strip())
except:
alpha_i[i,j] = 0.
wing_cd[i,j] = 0.
line_idx = divider_header + n_sw + line_idx
case_res.aerodynamics.wing_local_spans = wing_local_span
case_res.aerodynamics.wing_section_chords = wing_sectional_chord
case_res.aerodynamics.wing_section_cls = wing_cl
case_res.aerodynamics.wing_section_aoa_i = alpha_i
case_res.aerodynamics.wing_section_cds = wing_cd
with open(case.aero_result_filename_4,'r') as bod_der_vile:
# Extract results from body axis derivatives file
lines_2 = bod_der_vile.readlines()
case_res.stability.CX_u = float(lines_2[36+num_ctrl][24:34].strip())
case_res.stability.CX_v = float(lines_2[36+num_ctrl][43:54].strip())
case_res.stability.CX_w = float(lines_2[36+num_ctrl][65:74].strip())
case_res.stability.CY_u = float(lines_2[37+num_ctrl][24:34].strip())
case_res.stability.CY_v = float(lines_2[37+num_ctrl][43:54].strip())
case_res.stability.CY_w = float(lines_2[37+num_ctrl][65:74].strip())
case_res.stability.CZ_u = float(lines_2[38+num_ctrl][24:34].strip())
case_res.stability.CZ_v = float(lines_2[38+num_ctrl][43:54].strip())
case_res.stability.CZ_w = float(lines_2[38+num_ctrl][65:74].strip())
case_res.stability.Cl_u = float(lines_2[39+num_ctrl][24:34].strip())
case_res.stability.Cl_v = float(lines_2[39+num_ctrl][43:54].strip())
case_res.stability.Cl_w = float(lines_2[39+num_ctrl][65:74].strip())
case_res.stability.Cm_u = float(lines_2[40+num_ctrl][24:34].strip())
case_res.stability.Cm_v = float(lines_2[40+num_ctrl][43:54].strip())
case_res.stability.Cm_w = float(lines_2[40+num_ctrl][65:74].strip())
case_res.stability.Cn_u = float(lines_2[41+num_ctrl][24:34].strip())
case_res.stability.Cn_v = float(lines_2[41+num_ctrl][43:54].strip())
case_res.stability.Cn_w = float(lines_2[41+num_ctrl][65:74].strip())
case_res.stability.CX_p = float(lines_2[45+num_ctrl][24:34].strip())
case_res.stability.CX_q = float(lines_2[45+num_ctrl][43:54].strip())
case_res.stability.CX_r = float(lines_2[45+num_ctrl][65:74].strip())
case_res.stability.CY_p = float(lines_2[46+num_ctrl][24:34].strip())
case_res.stability.CY_q = float(lines_2[46+num_ctrl][43:54].strip())
case_res.stability.CY_r = float(lines_2[46+num_ctrl][65:74].strip())
case_res.stability.CZ_p = float(lines_2[47+num_ctrl][24:34].strip())
case_res.stability.CZ_q = float(lines_2[47+num_ctrl][43:54].strip())
case_res.stability.CZ_r = float(lines_2[47+num_ctrl][65:74].strip())
case_res.stability.Cl_p = float(lines_2[48+num_ctrl][24:34].strip())
case_res.stability.Cl_q = float(lines_2[48+num_ctrl][43:54].strip())
case_res.stability.Cl_r = float(lines_2[48+num_ctrl][65:74].strip())
case_res.stability.Cm_p = float(lines_2[49+num_ctrl][24:34].strip())
case_res.stability.Cm_q = float(lines_2[49+num_ctrl][43:54].strip())
case_res.stability.Cm_r = float(lines_2[49+num_ctrl][65:74].strip())
case_res.stability.Cn_p = float(lines_2[50+num_ctrl][24:34].strip())
case_res.stability.Cn_q = float(lines_2[50+num_ctrl][43:54].strip())
case_res.stability.Cn_r = float(lines_2[50+num_ctrl][65:74].strip())
results.append(case_res)
return results