summaryrefslogtreecommitdiff
path: root/evaluator.py
diff options
context:
space:
mode:
Diffstat (limited to 'evaluator.py')
-rw-r--r--evaluator.py79
1 files changed, 40 insertions, 39 deletions
diff --git a/evaluator.py b/evaluator.py
index 6965895..59d233a 100644
--- a/evaluator.py
+++ b/evaluator.py
@@ -13,13 +13,14 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
+
import sys
import os.path
import numpy as np
from math import sin, cos, atan, sqrt
-class Airfoil:
+class Evaluator:
'''Performs structural evaluations for the airfoil passed as argument.'''
def __init__(self, airfoil):
@@ -28,7 +29,7 @@ class Airfoil:
self.chord = airfoil.chord
self.semi_span = airfoil.semi_span
# mass and area
- self.mass_total = float()
+ self.mass_total = airfoil.mass + airfoil.spar.mass + airfoil.stringer.mass
self.mass_dist = []
self.lift_rectangular = []
@@ -37,22 +38,20 @@ class Airfoil:
self.drag = []
- def __str__(self):
- return type(self).__name__
-
def print_info(self, round):
- """
+ '''
Print all the component's evaluated data to the terminal.
This function's output is piped to the 'save_data' function below.
- """
- print('============================')
- print(' EVALUATOR DATA ')
- print('Evaluating:', str(self.airfoil))
+ '''
+
+ print(22 * '-')
+ print(' EVALUATOR DATA ')
+ print('Evaluating:', self.airfoil)
print('Chord length:', self.chord)
print('Semi-span:', self.semi_span)
print('Total airfoil mass:', self.mass_total)
- print('============================')
+ print(22 * '-')
print('Rectangular lift:\n', np.around(self.lift_rectangular, round))
print('Elliptical lift:\n', np.around(self.lift_elliptical, round))
print('Combined lift:\n', np.around(self.lift, round))
@@ -61,15 +60,13 @@ class Airfoil:
return None
def save_info(self, save_dir_path, number):
- """
- Save all the object's coordinates (must be full path).
- """
+ '''Save all the object's coordinates (must be full path).'''
- file_name = '{}_{}.txt'.format(self, number)
+ file_name = 'airfoil_{}_eval.txt'.format(number)
full_path = os.path.join(save_dir_path, file_name)
try:
with open(full_path, 'w') as sys.stdout:
- self.print_info(2)
+ self.print_info(6)
# This line required to reset behavior of sys.stdout
sys.stdout = sys.__stdout__
print('Successfully wrote to file {}'.format(full_path))
@@ -79,53 +76,57 @@ class Airfoil:
'Was the full path passed to the function?')
return None
- def get_mass_total(airfoil):
- total_mass = airfoil.mass + airfoil.spar.mass + airfoil.stringer.mass
- return total_mass
+ # def get_mass_total(airfoil):
+ # total_mass = airfoil.mass + airfoil.spar.mass + airfoil.stringer.mass
+ # return total_mass
# All these functions take integer arguments and return lists.
- def get_lift_rectangular(airfoil, lift):
- L_prime = [lift / (airfoil.semi_span * 2)
- for x in range(airfoil.semi_span)]
+ def get_lift_rectangular(self, lift):
+ L_prime = [lift / (self.semi_span * 2)
+ for x in range(self.semi_span)]
return L_prime
- def get_lift_elliptical(airfoil, L_0):
- L_prime = [L_0 * sqrt(1 - (y / airfoil.semi_span) ** 2)
- for y in range(airfoil.semi_span)]
+ def get_lift_elliptical(self, L_0):
+ L_prime = [L_0 * sqrt(1 - (y / self.semi_span) ** 2)
+ for y in range(self.semi_span)]
return L_prime
- def get_lift(rectangular, elliptical):
- F_z = [(rectangular[_] + elliptical[_]) / 2
- for _ in range(len(rectangular))]
+ def get_lift_total(self):
+ F_z = [(self.lift_rectangular[_] + self.lift_elliptical[_]) / 2
+ for _ in range(len(self.lift_rectangular))]
return F_z
- def get_mass_distribution(airfoil, total_mass):
- F_z = [total_mass / airfoil.semi_span
- for x in range(0, airfoil.semi_span)]
+ def get_mass_distribution(self, total_mass):
+ F_z = [total_mass / self.semi_span
+ for x in range(0, self.semi_span)]
return F_z
- def get_drag(airfoil, drag):
+ def get_drag(self, drag):
# Transform semi-span integer into list
- semi_span = [x for x in range(0, airfoil.semi_span)]
+ semi_span = [x for x in range(0, self.semi_span)]
# Drag increases after 80% of the semi_span
- cutoff = round(0.8 * airfoil.semi_span)
+ cutoff = round(0.8 * self.semi_span)
# Drag increases by 25% after 80% of the semi_span
F_x = [drag for x in semi_span[0:cutoff]]
F_x.extend([1.25 * drag for x in semi_span[cutoff:]])
return F_x
- def evaluate(self):
- self.drag = self.get_drag(self.airfoil, 10)
+ def analysis(self):
+ '''
+ Perform all analysis calculations and store in class instance.
+ '''
+
+ self.drag = self.get_drag(10)
self.lift_rectangular = self.get_lift_rectangular(10)
self.lift_elliptical = self.get_lift_elliptical(15)
- self.lift = self.get_lift(self.lift_rectangular, self.lift_elliptical)
+ self.lift = self.get_lift_total()
- self.mass_total = self.get_mass_total()
- self.mass_dist = self.get_mass_distribution(self.total_mass)
+ # self.mass_total = self.get_mass_total()
+ self.mass_dist = self.get_mass_distribution(self.mass_total)
return None
# def get_centroid(airfoil):
Copyright 2019--2024 Marius PETER