Source code for RCAIDE.Library.Methods.Aerodynamics.AERODAS.post_stall_coefficients

# RCAIDE/Library/Methods/Aerdoynamics/AERODAS/post_stall_coefficients.py
# 
# 
# Created:  Jul 2024, M. Clarke 

# ----------------------------------------------------------------------------------------------------------------------
# Imports 
# ----------------------------------------------------------------------------------------------------------------------
from RCAIDE.Framework.Core import Data, Units

# python imports 
import numpy as np

# ----------------------------------------------------------------------------------------------------------------------
# Post Stall Coefficients
# ----------------------------------------------------------------------------------------------------------------------    
[docs] def post_stall_coefficients(state,settings,geometry): """Uses the AERODAS method to determine poststall parameters for lift and drag for a single wing Assumptions: None Source: NASA TR: "Models of Lift and Drag Coefficients of Stalled and Unstalled Airfoils in Wind Turbines and Wind Tunnels" by D. A. Spera Inputs: settings.section_zero_lift_angle_of_attack [radians] geometry. aspect_ratio [Unitless] thickness_to_chord [Unitless] section.angle_attack_max_prestall_lift [radians] pre_stall_maximum_lift_drag_coefficient [Unitless] pre_stall_maximum_drag_coefficient_angle [Unitless] state.conditions.aerodynamics.angle_of_attack [radians] Outputs: CL2 (coefficient of lift) [Unitless] CD2 (coefficient of drag) [Unitless] (packed in state.conditions.aerodynamics.post_stall_coefficients[geometry.tag]) Properties Used: N/A """ # unpack inputs wing = geometry A0 = settings.section_zero_lift_angle_of_attack AR = wing.aspect_ratio t_c = wing.thickness_to_chord ACL1 = wing.section.angle_attack_max_prestall_lift CD1max = wing.pre_stall_maximum_lift_drag_coefficient ACD1 = wing.pre_stall_maximum_drag_coefficient_angle alpha = state.conditions.aerodynamics.angle_of_attack if wing.vertical == True: alpha = 0. * np.ones_like(alpha) # Equation 9a and b F1 = 1.190*(1.0-(t_c*t_c)) F2 = 0.65 + 0.35*np.exp(-(9.0/AR)**2.3) # Equation 10b and c G1 = 2.3*np.exp(-(0.65*t_c)**0.9) G2 = 0.52 + 0.48*np.exp(-(6.5/AR)**1.1) # Equation 8a and b CL2max = F1*F2 CD2max = G1*G2 # Equation 11d RCL2 = 1.632-CL2max # Equation 11e N2 = 1 + CL2max/RCL2 # Equation 11a,b,c con1 = np.logical_and(0<alpha,alpha<ACL1) con2 = np.logical_and(ACL1<=alpha,alpha<=(92.0*Units.deg)) con3 = alpha>=(92.0*Units.deg) CL2 = np.zeros_like(alpha) CL2[con1] = 0 CL2[con2] = -0.032*(alpha[con2]/Units.deg-92.0) - RCL2*((92.*Units.deg-alpha[con2])/(51.0*Units.deg))**N2 CL2[con3] = -0.032*(alpha[con3]/Units.deg-92.0) + RCL2*((alpha[con3]-92.*Units.deg)/(51.0*Units.deg))**N2 # If alpha is negative flip things for lift alphan = - alpha+2*A0 con1 = np.logical_and(0<alphan, alphan<ACL1) con2 = np.logical_and(ACL1<=alphan, alphan<=(92.0*Units.deg)) con3 = alphan>=(92.0*Units.deg) CL2[con1] = 0. CL2[con2] = 0.032*(alphan[con2]/Units.deg-92.0) + RCL2*((92.*Units.deg-alphan[con2])/(51.0*Units.deg))**N2 CL2[con3] = 0.032*(alphan[con3]/Units.deg-92.0) - RCL2*((alphan[con3]-92.*Units.deg)/(51.0*Units.deg))**N2 # Equation 12a con1 = np.logical_and((2*A0-ACL1)<alpha, alpha<ACL1) con2 = alpha>ACD1 CD2 = 0.0 * np.ones_like(alpha) CD2[con1] = 0. CD2[con2] = CD1max[con2] + (CD2max - CD1max[con2]) * np.sin((alpha[con2]-ACD1[con2])/(np.pi/2-ACD1[con2])) # If alpha is negative flip things for drag alphan = -alpha + 2*A0 con1 = np.logical_and((2*A0-ACL1)<alphan,alphan<ACL1) con2 = alphan>=ACD1 CD2[con1] = 0. CD2[con2] = CD1max[con2] + (CD2max - CD1max[con2]) * np.sin((alphan[con2]-ACD1[con2])/(np.pi/2-ACD1[con2])) # Pack outputs wing_result = Data( lift_coefficient = CL2, drag_coefficient = CD2 ) state.conditions.aerodynamics.post_stall_coefficients[wing.tag] = wing_result return CL2, CD2