Source code for RCAIDE.Library.Methods.Geometry.Airfoil.compute_naca_4series
# RCAIDE/Library/Methods/Geometry/Two_Dimensional/Airfoil/compute_naca_4series.py
#
#
# Created: Jul 2024, M. Clarke
# ----------------------------------------------------------------------------------------------------------------------
# IMPORT
# ----------------------------------------------------------------------------------------------------------------------
from RCAIDE.Framework.Core import Data
import numpy as np
# ----------------------------------------------------------------------------------------------------------------------
# compute_naca_4series
# ----------------------------------------------------------------------------------------------------------------------
[docs]
def compute_naca_4series(airfoil_geometry_file,npoints= 201, leading_and_trailing_edge_resolution_factor = 1.5 ):
"""Computes the points of NACA 4-series airfoil
Assumptions:
None
Source:
None
Inputs:
airfoils <string>
npoints [unitless]
leading_and_trailing_edge_resolution_factor [unitless]
Outputs:
airfoil_data.
thickness_to_chord [unitless]
x_coordinates [meters]
y_coordinates [meters]
x_upper_surface [meters]
x_lower_surface [meters]
y_upper_surface [meters]
y_lower_surface [meters]
camber_coordinates [meters]
Properties Used:
N/A
"""
if npoints%2 != 1:
npoints+= 1
print('Number of points must be odd, changing to ' + str(npoints) + ' points')
geometry = Data()
half_npoints = npoints/2 # number of points per side
airfoil_digits = [int(x) for x in airfoil_geometry_file]
camber = airfoil_digits[0]/100 # maximum camber as a fraction of chord
camber_loc = airfoil_digits[1]/10 # maximum camber location as a fraction of chord
thickness = airfoil_digits[2]/10 + airfoil_digits[3]/100 # maximum thickness as a fraction of chord
x_us = np.linspace(0,1,int(np.ceil(half_npoints))+ (npoints%2 == 0))
x_ls = np.linspace(0,1,int(np.ceil(half_npoints)))
if leading_and_trailing_edge_resolution_factor != None:
te = leading_and_trailing_edge_resolution_factor # points per side and trailing-edge bunching factor
x_us = 1 - (te+1)*x_us*(1-x_us)**te - (1-x_us)**(te+1) # bunched points, x, 0 to 1
x_ls = 1 - (te+1)*x_ls*(1-x_ls)**te - (1-x_ls)**(te+1) # bunched points, x, 0 to 1
# normalized thickness, gap at trailing edge
t_us = .2969*np.sqrt(x_us) - 0.126*x_us - 0.3516*(x_us**2) + 0.2843*(x_us**3) - 0.1015*(x_us**4)
t_ls = .2969*np.sqrt(x_ls) - 0.126*x_ls - 0.3516*(x_ls**2) + 0.2843*(x_ls**3) - 0.1015*(x_ls**4)
t_us = t_us*thickness/.2
t_ls = t_ls*thickness/.2
m = camber
p = camber_loc
c_us = m/(1-p)**2 * ((1-2*p)+2*p*x_us-x_us**2)
c_ls = m/(1-p)**2 * ((1-2*p)+2*p*x_ls-x_ls**2)
if m == 0 and p == 0:
pass
else:
I_us = np.where(x_us<p)[0]
I_ls = np.where(x_ls<p)[0]
c_us[I_us] = m/p**2*(2*p*x_us[I_us]-x_us[I_us]**2)
c_ls[I_ls] = m/p**2*(2*p*x_ls[I_ls]-x_ls[I_ls]**2)
x_up_surf = x_us[1:]
x_lo_surf = np.flip(x_ls)
y_up_surf = (c_us + t_us)[1:]
y_lo_surf = np.flip(c_ls - t_ls)
# concatenate upper and lower surfaces
x_data = np.hstack((x_lo_surf,x_up_surf))
y_data = np.hstack((y_lo_surf, y_up_surf))
max_t = np.max(thickness)
max_c = max(x_data) - min(x_data)
t_c = max_t/max_c
geometry.max_thickness = max_t
geometry.x_coordinates = x_data
geometry.y_coordinates = y_data
geometry.x_upper_surface = x_us
geometry.x_lower_surface = x_ls
geometry.y_upper_surface = np.append(0,y_up_surf)
geometry.y_lower_surface = y_lo_surf[::-1]
geometry.camber_coordinates = camber
geometry.thickness_to_chord = t_c
return geometry