Source code for RCAIDE.Library.Methods.Geometry.Planform.populate_control_sections
# RCAIDE/Library/Methods/Geometry/Planform/populate_control_sections.py
#
# Created: Oct 2024, M. Clarke
# ----------------------------------------------------------------------------------------------------------------------
# IMPORT
# ----------------------------------------------------------------------------------------------------------------------
# RCAIDE imports
from RCAIDE.Framework.Core import Container
# package imports
import numpy as np
# ----------------------------------------------------------------------------------------------------------------------
# populate_control_sections
# ----------------------------------------------------------------------------------------------------------------------
[docs]
def populate_control_sections(wing):
"""This function takes the control surfaces defined on a wing and appends them to wing segments
Conditional statements are used to determine where the control surface bounds are in relation
to the wing segments. For example, If a control surface extends beyond a wing segment, the bounds
on the control surface span fraction are set to be the bounds of the wing section
Assumptions:
None
Source:
None
Properties Used:
N/A
"""
w_cs = wing.control_surfaces
w_seg = wing.segments
for i , seg in enumerate(w_seg):
seg.control_surfaces = Container()
# loop throught the control surfaces on the wing
for cs in w_cs :
sf = np.zeros(2) # set a temporary data structure to store the span fraction bounds
sf[0] = cs.span_fraction_start
sf[1] = cs.span_fraction_end
# loop though the segments on the wing
for i , seg in enumerate(w_seg):
append_CS = False
s_sf = np.zeros(2)
if i == 0: # the first segment (root) cannot have any control surfaces
pass
else: # the following block determines where the bounds of the control surface are in relation to the segment breaks
# Case 1
prev_seg = list(w_seg.keys())[i-1]
current_seg = list(w_seg.keys())[i]
if (sf[0] < w_seg[prev_seg].percent_span_location) and (sf[1] < w_seg[current_seg].percent_span_location) and (sf[1] > w_seg[prev_seg].percent_span_location) :
s_sf = np.array([w_seg[prev_seg].percent_span_location,sf[1]])
append_CS = True
# Case 2
elif (sf[0] < w_seg[prev_seg].percent_span_location) and (sf[1] == w_seg[current_seg].percent_span_location):
s_sf = np.array([w_seg[prev_seg].percent_span_location,w_seg[current_seg].percent_span_location])
append_CS = True
# Case 3
elif (sf[0] < w_seg[prev_seg].percent_span_location) and (sf[1] > w_seg[current_seg].percent_span_location):
s_sf = np.array([w_seg[prev_seg].percent_span_location,w_seg[current_seg].percent_span_location])
append_CS = True
# Case 4
elif (sf[0] == w_seg[prev_seg].percent_span_location) and (sf[1] < w_seg[current_seg].percent_span_location):
s_sf = np.array([w_seg[prev_seg].percent_span_location,sf[1]])
append_CS = True
# Case 5
elif (sf[0] == w_seg[prev_seg].percent_span_location) and (sf[1] == w_seg[current_seg].percent_span_location):
s_sf = np.array([w_seg[prev_seg].percent_span_location,w_seg[current_seg].percent_span_location])
append_CS = True
# Case 6
elif (sf[0] > w_seg[prev_seg].percent_span_location) and (sf[1] < w_seg[current_seg].percent_span_location):
s_sf = np.array([sf[0],sf[1]])
append_CS = True
# Case 7
elif (sf[0] > w_seg[prev_seg].percent_span_location) and (sf[1] == w_seg[current_seg].percent_span_location) :
s_sf = np.array([sf[0],w_seg[current_seg].percent_span_location])
append_CS = True
# Case 8
elif (sf[0] > w_seg[prev_seg].percent_span_location) and (sf[1] > w_seg[current_seg].percent_span_location) and (sf[0] < w_seg[current_seg].percent_span_location):
s_sf = np.array([sf[0],w_seg[current_seg].percent_span_location])
append_CS = True
else:
append_CS = False
if append_CS == True:
# initialize the data structure for control surfaces , store results, and append to the correct segment
control_surface = type(cs)() # control_surface takes came type as cs (Slat, Aileron, Data(for VLM), etc)
control_surface.tag = cs.tag
control_surface.span = cs.span*(s_sf[1]-s_sf[0])/(cs.span_fraction_end-cs.span_fraction_start)
control_surface.span_fraction_start = s_sf[0]
control_surface.span_fraction_end = s_sf[1]
control_surface.hinge_fraction = cs.hinge_fraction
control_surface.chord_fraction = cs.chord_fraction
control_surface.sign_duplicate = cs.sign_duplicate
control_surface.deflection = cs.deflection
control_surface.configuration_type = cs.configuration_type
control_surface.gain = cs.gain
# for calls from make_VLM_wings
if 'cs_type' in cs.keys():
control_surface.cs_type = cs.cs_type
w_seg[current_seg].control_surfaces.append(control_surface)
# returns an updated wing with control surfaces appended onto the wing segments
return wing