@@ -36,7 +36,9 @@ mutable struct Panel
3636 cl_coefficients:: Union{Nothing,Vector{Float64}}
3737 cd_coefficients:: Union{Nothing,Vector{Float64}}
3838 cm_coefficients:: Union{Nothing,Vector{Float64}}
39- polar_data:: Union{Nothing, Tuple{Extrapolation}}
39+ cl_interp:: Function
40+ cd_interp:: Function
41+ cm_interp:: Function
4042 aerodynamic_center:: MVec3
4143 control_point:: MVec3
4244 bound_point_1:: MVec3
@@ -78,10 +80,8 @@ mutable struct Panel
7880 aero_model = isa (section_1. aero_input, String) ? section_1. aero_input : section_1. aero_input[1 ]
7981
8082 # Initialize aerodynamic properties
81- cl_coeffs = nothing
82- cd_coeffs = nothing
83- cm_coeffs = nothing
84- polar_data = nothing
83+ cl_coeffs, cd_coeffs, cm_coeffs = nothing , nothing , nothing
84+ cl_interp, cd_interp, cm_interp = ()-> nothing , ()-> nothing , ()-> nothing
8585
8686 if aero_model == " lei_airfoil_breukels"
8787 cl_coeffs, cd_coeffs, cm_coeffs = compute_lei_coefficients (section_1, section_2)
@@ -92,29 +92,21 @@ mutable struct Panel
9292 throw (ArgumentError (" Polar data must have same shape" ))
9393 end
9494 polar_data = (aero_1 + aero_2) / 2
95- cl_interp = linear_interpolation (
96- polar_data[:,1 ],
97- polar_data[:,2 ];
98- extrapolation_bc= NaN
99- )
100- cd_interp = linear_interpolation (
101- polar_data[:,1 ],
102- polar_data[:,3 ];
103- extrapolation_bc= NaN
104- )
105- cm_interp = linear_interpolation (
106- polar_data[:,1 ],
107- polar_data[:,4 ];
108- extrapolation_bc= NaN
109- )
110- polar_data = (cl_interp, cd_interp, cm_interp)
95+ cl_interp_ = linear_interpolation (polar_data[:,1 ], polar_data[:,2 ]; extrapolation_bc= NaN )
96+ cd_interp_ = linear_interpolation (polar_data[:,1 ], polar_data[:,3 ]; extrapolation_bc= NaN )
97+ cm_interp_ = linear_interpolation (polar_data[:,1 ], polar_data[:,4 ]; extrapolation_bc= NaN )
98+ cl_interp = (α) -> cl_interp_ (α)
99+ cd_interp = (α) -> cd_interp_ (α)
100+ cm_interp = (α) -> cm_interp_ (α)
111101 elseif aero_model == " interpolations"
112102 cl_left, cd_left, cm_left = section_1. aero_input[2 ]
113103 cl_right, cd_right, cm_right = section_2. aero_input[2 ]
114- cl_interp = (α, β) -> 0.5 cl_left (α, β) + 0.5 cl_right (α, β)
115- cd_interp = (α, β) -> 0.5 cd_left (α, β) + 0.5 cd_right (α, β)
116- cm_interp = (α, β) -> 0.5 cm_left (α, β) + 0.5 cm_right (α, β)
117- polar_data = (cl_interp, cd_interp, cm_interp)
104+ cl_interp = cl_left === cl_right ? cl_left :
105+ (α, β) -> 0.5 cl_left (α, β) + 0.5 cl_right (α, β)
106+ cd_interp = cd_left === cd_right ? cd_left :
107+ (α, β) -> 0.5 cd_left (α, β) + 0.5 cd_right (α, β)
108+ cm_interp = cm_left === cm_right ? cm_left :
109+ (α, β) -> 0.5 cm_left (α, β) + 0.5 cm_right (α, β)
118110 elseif aero_model != " inviscid"
119111 throw (ArgumentError (" Unsupported aero model: $aero_model " ))
120112 end
@@ -132,7 +124,8 @@ mutable struct Panel
132124 new (
133125 TE_point_1, LE_point_1, TE_point_2, LE_point_2,
134126 chord, nothing , corner_points, aero_model,
135- cl_coeffs, cd_coeffs, cm_coeffs, polar_data,
127+ cl_coeffs, cd_coeffs, cm_coeffs,
128+ cl_interp, cd_interp, cm_interp,
136129 aerodynamic_center, control_point,
137130 bound_point_1, bound_point_2,
138131 x_airf, y_airf, z_airf,
@@ -269,9 +262,9 @@ function calculate_cl(panel::Panel, alpha::Float64)
269262 elseif panel. aero_model == " inviscid"
270263 return 2 π * alpha
271264 elseif panel. aero_model == " polar_data"
272- return panel. polar_data[ 1 ] (alpha)
265+ return panel. cl_interp (alpha)
273266 elseif panel. aero_model == " interpolations"
274- return panel. polar_data[ 1 ] (alpha, 0.0 )
267+ return panel. cl_interp (alpha, 0.0 )
275268 else
276269 throw (ArgumentError (" Unsupported aero model: $(panel. aero_model) " ))
277270 end
@@ -281,6 +274,14 @@ function calculate_cl(polar_data::Nothing, model_type::String, alpha::Float64)
281274 return 2 π * alpha
282275end
283276
277+ function calculate_cl (polar_data:: Tuple{Function, Function, Function} , model_type:: String , alpha:: Float64 )
278+ if model_type == " polar_data"
279+ return polar_data[1 ](alpha)
280+ elseif model_type == " interpolations"
281+ return polar_data[1 ](alpha, 0.0 )
282+ end
283+ end
284+
284285"""
285286 calculate_cd_cm(panel::Panel, alpha::Float64)
286287
@@ -297,12 +298,12 @@ function calculate_cd_cm(panel::Panel, alpha::Float64)
297298 elseif panel. aero_model == " inviscid"
298299 return 0.0 , 0.0
299300 elseif panel. aero_model == " polar_data"
300- cd = panel. polar_data[ 2 ] (alpha)
301- cm = panel. polar_data[ 3 ] (alpha)
301+ cd = panel. cd_interp (alpha)
302+ cm = panel. cm_interp (alpha)
302303 return cd, cm
303304 elseif panel. aero_model == " interpolations"
304- cd = panel. polar_data[ 2 ] (alpha, 0.0 )
305- cm = panel. polar_data[ 3 ] (alpha, 0.0 )
305+ cd = panel. cd_interp (alpha, 0.0 )
306+ cm = panel. cm_interp (alpha, 0.0 )
306307 return cd, cm
307308 else
308309 throw (ArgumentError (" Unsupported aero model: $(panel. aero_model) " ))
0 commit comments