*ARCHIVED* development moved to aircraft-studio.
Final Stringer.add implementation
Changed files
creator.py
@@ -78,19 +78,11 @@
78
78
print('Chord length:', self.chord)
79
79
print('Semi-span:', self.semi_span)
80
80
print('============================')
81
Removed:
print('x_u the upper x-coordinates:',
82
Removed:
np.around(self.x_u, round),
83
Removed:
sep='\n')
84
Removed:
print('y_u the upper y-coordinates:',
85
Removed:
np.around(self.y_u, round),
86
Removed:
sep='\n')
87
Removed:
print('x_l the lower x-coordinates:',
88
Removed:
np.around(self.x_l, round),
89
Removed:
sep='\n')
90
Removed:
print('y_l the lower y-coordinates:',
91
Removed:
np.around(self.y_l, round),
92
Removed:
sep='\n')
93
Removed:
print('\n')
81
Added:
print('x_u the upper x-coordinates:\n', np.around(self.x_u, round))
82
Added:
print('y_u the upper y-coordinates:\n', np.around(self.y_u, round))
83
Added:
print('x_l the lower x-coordinates:\n', np.around(self.x_l, round))
84
Added:
print('y_l the lower y-coordinates:\n', np.around(self.y_l, round))
85
Added:
# print('\n')
94
86
return None
95
87
96
88
def save_coord(self, save_dir_path):
@@ -140,7 +132,6 @@
140
132
141
133
Parameters:
142
134
naca_num: 4-digit NACA wing
143
Removed:
chord: wing chord length, in any unit
144
135
145
136
Return:
146
137
None
@@ -284,22 +275,23 @@
284
275
285
276
286
277
class Stringer(Coordinates):
287
Removed:
"""Contains the coordinates of stringer(s)."""
278
Added:
"""Contains the coordinates of all stringers."""
288
279
global parent
289
280
290
281
def __init__(self):
291
282
super().__init__(parent.chord, parent.semi_span)
292
283
293
Removed:
def add(self, airfoil_coord, spar_coord, den_u_1, den_u_2, den_l_1,
294
Removed:
den_l_2):
284
Added:
def add(self, airfoil_coord, spar_coord, stringer_u_1, stringer_u_2,
285
Added:
stringer_l_1, stringer_l_2):
295
286
"""
296
Removed:
Add stringers to the wing from their density distribution.
287
Added:
Add equally distributed stringers to four airfoil locations
288
Added:
(upper nose, lower nose, upper surface, lower surface).
297
289
298
290
Parameters:
299
Removed:
den_u_1: upper nose stringer density (until first spar)
300
Removed:
den_u_2: upper surface stringer density
301
Removed:
den_l_1: lower nose stringer density (until first spar)
302
Removed:
den_l_2: lower surface stringer density
291
Added:
stringer_u_1: upper nose number of stringers
292
Added:
stringer_u_2: upper surface number of stringers
293
Added:
stringer_l_1: lower nose number of stringers
294
Added:
stringer_l_2: lower surface number of stringers
303
295
304
296
Returns:
305
297
None
@@ -311,40 +303,52 @@
311
303
airfoil_y_u = airfoil_coord[1]
312
304
airfoil_x_l = airfoil_coord[2]
313
305
airfoil_y_l = airfoil_coord[3]
314
Removed:
315
306
# Spar coordinates
316
307
# unpacked from 'coordinates' (list of lists in 'Coordinates').
317
Removed:
spar_x_u = spar_coord[0]
318
Removed:
spar_y_u = spar_coord[1]
319
Removed:
spar_x_l = spar_coord[2]
320
Removed:
spar_y_l = spar_coord[3]
321
Removed:
322
Removed:
# Find distance between leading edge and first upper stringer,
323
Removed:
# from density parameter den_u_1.
324
Removed:
interval = den_u_1 * spar_x_u[0]
325
Removed:
# initialise first self.stringer_x_u at first interval.
308
Added:
try:
309
Added:
spar_x_u = spar_coord[0]
310
Added:
spar_y_u = spar_coord[1]
311
Added:
spar_x_l = spar_coord[2]
312
Added:
spar_y_l = spar_coord[3]
313
Added:
except:
314
Added:
print('Unable to initialize stringers. Were spars created?')
315
Added:
# Find distance between leading edge and first upper stringer
316
Added:
interval = spar_x_u[0] / (stringer_u_1 + 1)
317
Added:
# initialise first self.stringer_x_u at first interval
326
318
x = interval
327
Removed:
# Add upper stringers until first spar.
328
Removed:
while x < spar_x_u[0]:
319
Added:
# Add upper stringers from leading edge until first spar.
320
Added:
for _ in range(0, stringer_u_1):
329
321
# Index of the first value of airfoil_x_u > x
330
322
index = bi.bisect_left(airfoil_x_u, x)
331
Removed:
# Append the value of airfoil_x_u at index to stringer's coordinates
332
323
self.x_u.append(airfoil_x_u[index])
333
324
self.y_u.append(airfoil_y_u[index])
334
325
x += interval
326
Added:
# Add upper stringers from first spar until last spar
327
Added:
interval = (spar_x_u[-1] - spar_x_u[0]) / (stringer_u_2 + 1)
328
Added:
x = interval + spar_x_u[0]
329
Added:
for _ in range(0, stringer_u_2):
330
Added:
index = bi.bisect_left(airfoil_x_u, x)
331
Added:
self.x_u.append(airfoil_x_u[index])
332
Added:
self.y_u.append(airfoil_y_u[index])
333
Added:
x += interval
335
334
336
Removed:
# Find interval between leading edge and first lower stringer,
337
Removed:
# from density parameter den_l_1.
338
Removed:
interval = den_l_1 * spar_x_u[0]
339
Removed:
# initialise first self.stringer_x_l at first interval.
335
Added:
# Find distance between leading edge and first lower stringer
336
Added:
interval = spar_x_l[0] / (stringer_l_1 + 1)
340
337
x = interval
341
Removed:
# Add lower stringers until first spar.
342
Removed:
while x < spar_x_l[0]:
343
Removed:
# Index of the first value of self.x_l > x
338
Added:
# Add lower stringers from leading edge until first spar.
339
Added:
for _ in range(0, stringer_l_1):
344
340
index = bi.bisect_left(airfoil_x_l, x)
345
Removed:
self.x_u.append(airfoil_x_u[index])
346
Removed:
self.y_u.append(airfoil_y_u[index])
341
Added:
self.x_l.append(airfoil_x_l[index])
342
Added:
self.y_l.append(airfoil_y_l[index])
347
343
x += interval
344
Added:
# Add lower stringers from first spar until last spar
345
Added:
interval = (spar_x_l[-1] - spar_x_l[0]) / (stringer_l_2 + 1)
346
Added:
x = interval + spar_x_l[0]
347
Added:
for _ in range(0, stringer_l_2):
348
Added:
index = bi.bisect_left(airfoil_x_l, x)
349
Added:
self.x_l.append(airfoil_x_l[index])
350
Added:
self.y_l.append(airfoil_y_l[index])
351
Added:
x += interval
348
352
349
353
super().pack_coord()
350
354
return None
@@ -375,16 +379,23 @@
375
379
for _ in range(0, len(spar.x_u)):
376
380
x = (spar.x_u[_], spar.x_l[_])
377
381
y = (spar.y_u[_], spar.y_l[_])
378
Removed:
plt.plot(x, y, '.-', color='b', label='spar')
382
Added:
plt.plot(x, y, '.-', color='b')
379
383
plt.legend()
380
384
except:
381
385
print('Did not plot spars. Were they added?')
382
386
383
387
# Plot stringers
384
388
try:
389
Added:
# Upper stringers
385
390
for _ in range(0, len(stringer.x_u)):
386
Removed:
x = (spar.x_u[_], spar.x_l[_])
387
Removed:
y = (spar.y_u[_], spar.y_l[_])
391
Added:
x = stringer.x_u[_]
392
Added:
y = stringer.y_u[_]
393
Added:
plt.plot(x, y, '.', color='y')
394
Added:
# Lower stringers
395
Added:
for _ in range(0, len(stringer.x_l)):
396
Added:
x = stringer.x_l[_]
397
Added:
y = stringer.y_l[_]
398
Added:
plt.plot(x, y, '.', color='y')
388
399
except:
389
400
print('Unable to plot stringers. Were they created?')
390
401
main.py
@@ -21,7 +21,7 @@
21
21
import time
22
22
start_time = time.time()
23
23
24
Removed:
CHORD_LENGTH = 40
24
Added:
CHORD_LENGTH = 100
25
25
SEMI_SPAN = 200
26
26
27
27
POP_SIZE = 1
@@ -38,26 +38,26 @@
38
38
af = creator.Airfoil()
39
39
# Define NACA airfoil coordinates
40
40
af.add_naca(2412)
41
Added:
af.print_coord(2)
41
42
42
43
# Create spar instance
43
44
af.spar = creator.Spar()
44
45
# Define the spar coordinates, stored in single spar object
45
46
af.spar.add(af.coord, 0.15)
46
47
af.spar.add(af.coord, 0.55)
47
Removed:
# Print coordinates of af.spar to terminal
48
Added:
af.spar.print_coord(2)
48
49
49
50
# Create stringer instance
50
51
af.stringer = creator.Stringer()
51
Removed:
# Define the stringer coordinates from airfoil's and spars'
52
Removed:
af.stringer.add(af.coord, af.spar.coord, 0.2, 0.2, 0.2, 0.2)
52
Added:
# Define the stringer coordinates from their amount
53
Added:
af.stringer.add(af.coord, af.spar.coord, 10, 7, 5, 6)
53
54
# Print coordinates of af.stringer to terminal
54
Removed:
# af.stringer.print_coord(2)
55
Added:
af.stringer.print_coord(2)
55
56
56
Removed:
print(af.stringer.coord)
57
57
# Plot components with matplotlib
58
58
creator.plot(af, af.spar, af.stringer)
59
59
60
Removed:
# # Save component coordinates
60
Added:
# Save component coordinates
61
61
# af.save_coord(SAVE_PATH)
62
62
# af.spar.save_coord(SAVE_PATH)
63
63