Source code for RCAIDE.Library.Methods.Geometry.Airfoil.import_airfoil_polars

# RCAIDE/Library/Methods/Geometry/Two_Dimensional/Airfoil/import_airfoil_polars.py
# 
# 
# Created:  Jul 2024, M. Clarke 

# ----------------------------------------------------------------------------------------------------------------------
#  IMPORT
# ----------------------------------------------------------------------------------------------------------------------    

from RCAIDE.Framework.Core import Data , Units   
import numpy as np

# ----------------------------------------------------------------------------------------------------------------------
#  import_airfoil_polars
# ----------------------------------------------------------------------------------------------------------------------    
[docs] def import_airfoil_polars(airfoil_polar_files,angel_of_attack_discretization = 89): """This imports airfoil polars from a text file output from XFOIL or Airfoiltools.com Assumptions: Input airfoil polars file is obtained from XFOIL or from Airfoiltools.com Source: http://airfoiltools.com/ Inputs: airfoil polar files <list of strings> Outputs: data numpy array with airfoil data Properties Used: N/A """ # number of airfoils num_polars = 0 n_p = len(airfoil_polar_files) if n_p < 3: raise AttributeError('Provide three or more airfoil polars to compute surrogate') num_polars = max(num_polars, n_p) # create empty data structures airfoil_data = Data() AoA = np.zeros((num_polars,angel_of_attack_discretization)) CL = np.zeros((num_polars,angel_of_attack_discretization)) CD = np.zeros((num_polars,angel_of_attack_discretization)) Re = np.zeros(num_polars) Ma = np.zeros(num_polars) AoA_interp = np.linspace(-6,16,angel_of_attack_discretization) for j in range(len(airfoil_polar_files)): # Open file and read column names and data block f = open(airfoil_polar_files[j]) data_block = f.readlines() f.close() # Ignore header for header_line in range(len(data_block)): line = data_block[header_line] if 'Re =' in line: Re[j] = float(line[25:40].strip().replace(" ", "")) if 'Mach =' in line: Ma[j] = float(line[7:20].strip().replace(" ", "")) if '---' in line: data_block = data_block[header_line+1:] break # Remove any extra lines at end of file: last_line = False while last_line == False: if data_block[-1]=='\n': data_block = data_block[0:-1] else: last_line = True data_len = len(data_block) airfoil_aoa= np.zeros(data_len) airfoil_cl = np.zeros(data_len) airfoil_cd = np.zeros(data_len) # Loop through each value: append to each column for line_count , line in enumerate(data_block): airfoil_aoa[line_count] = float(data_block[line_count][0:8].strip()) airfoil_cl[line_count] = float(data_block[line_count][10:17].strip()) airfoil_cd[line_count] = float(data_block[line_count][20:27].strip()) AoA[j,:] = AoA_interp CL[j,:] = np.interp(AoA_interp,airfoil_aoa,airfoil_cl) CD[j,:] = np.interp(AoA_interp,airfoil_aoa,airfoil_cd) airfoil_data.aoa_from_polar = AoA*Units.degrees airfoil_data.re_from_polar = Re airfoil_data.mach_number = Ma airfoil_data.lift_coefficients = CL airfoil_data.drag_coefficients = CD return airfoil_data