From 3bba98c9869e07fede355d83fd2498996e8a54fc Mon Sep 17 00:00:00 2001 From: Marius Peter Date: Fri, 21 Jun 2019 17:06:06 -0700 Subject: structure of Evaluator mimicks structure of Coordinates --- evaluator.py | 79 ++++++++++++++++++++++++++++++------------------------------ 1 file changed, 40 insertions(+), 39 deletions(-) (limited to 'evaluator.py') 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 . + 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): -- cgit v1.2.3