diff options
Diffstat (limited to 'evaluator.py')
-rw-r--r-- | evaluator.py | 206 |
1 files changed, 107 insertions, 99 deletions
diff --git a/evaluator.py b/evaluator.py index aac7f61..096e9a0 100644 --- a/evaluator.py +++ b/evaluator.py @@ -16,7 +16,8 @@ class Evaluator: """Performs structural evaluations on aircrafts. Individual aircrafts must claim an Evaluator object as parent.""" def __init__(self): - self.aircrafts = [] + self.tree = {} # Dictionary contains aircrafts and subcomponents + self.results = [] # # Evaluator knows all geometrical info from evaluated airfoil # self.airfoil = self.get_airfoil(aircraft) # self.spars = self.get_spars(aircraft) @@ -32,87 +33,23 @@ class Evaluator: # Inertia terms: self.I_ = {'x': 0, 'z': 0, 'xz': 0} - def __str__(self): - return type(self).__name__ - - def update(self): - """Get all aircrafts' data.""" - try: - print(self.aircrafts) - except: - print("failed!") - - # def get_airfoil(self, aircraft): - # """Get data of spars belonging to aircraft.""" - # try: - # pass - # except: - # pass - # pass - - # def get_spars(self, aircraft): - # """Get data of spars belonging to aircraft.""" - # try: - # pass - # except: - # pass - # pass - - # def get_stringers(self, aircraft): - # """Get data of spars belonging to aircraft.""" - # try: - # pass - # except: - # pass - # pass - - def info_print(self, round): - """Print all the component's evaluated data to the terminal.""" - name = f' {print(self)} DATA FOR {str(self).upper()} ' - num_of_dashes = len(name) - print(num_of_dashes * '-') - print(name) - for k, v in self.__dict__.items(): - if type(v) != list: - print('{}:\n'.format(k), v) - print(num_of_dashes * '-') - for k, v in self.__dict__.items(): - if type(v) == list: - print('{}:\n'.format(k), np.around(v, round)) - return None - - def info_save(self, save_path, number): - """Save all the object's coordinates (must be full path).""" - file_name = 'airfoil_{}_eval.txt'.format(number) - full_path = os.path.join(save_path, file_name) - try: - with open(full_path, 'w') as sys.stdout: - self.info_print(6) - # This line required to reset behavior of sys.stdout - sys.stdout = sys.__stdout__ - print('Successfully wrote to file {}'.format(full_path)) - except IOError: - print( - 'Unable to write {} to specified directory.\n'.format( - file_name), 'Was the full path passed to the function?') - return None - - # All these functions take integer arguments and return lists. - - def get_lift_rectangular(self, lift): - L_prime = [lift / (self.semi_span * 2) for x in range(self.semi_span)] + def get_lift_rectangular(aircraft, lift): + L_prime = [ + lift / (aircraft.semi_span * 2) for x in range(aircraft.semi_span) + ] return L_prime - def get_lift_elliptical(self, L_0): + def get_lift_elliptical(aircraft, L_0): L_prime = [ - L_0 / (self.semi_span * 2) * sqrt(1 - (y / self.semi_span)**2) - for y in range(self.semi_span) + L_0 / (aircraft.semi_span * 2) * sqrt(1 - + (y / aircraft.semi_span)**2) + for y in range(aircraft.semi_span) ] return L_prime - def get_lift_total(self): - F_z = [(self.lift_rectangular[_] + self.lift_elliptical[_]) / 2 - for _ in range(len(self.lift_rectangular))] + def get_lift_total(aircraft): + F_z = [(aircraft.lift_rectangular[_] + aircraft.lift_elliptical[_]) / 2 + for _ in range(len(aircraft.lift_rectangular))] return F_z def get_mass_distribution(self, total_mass): @@ -131,15 +68,15 @@ class Evaluator: F_x.extend([1.25 * drag for x in semi_span[cutoff:]]) return F_x - def get_centroid(self): + def get_centroid(aircraft): """Return the coordinates of the centroid.""" - stringer_area = self.stringer.area - cap_area = self.spar.cap_area + stringer_area = aircraft.stringer.area + cap_area = aircraft.spar.cap_area - caps_x = [value for spar in self.spar.x for value in spar] - caps_z = [value for spar in self.spar.z for value in spar] - stringers_x = self.stringer.x - stringers_z = self.stringer.z + caps_x = [value for spar in aircraft.spar.x for value in spar] + caps_z = [value for spar in aircraft.spar.z for value in spar] + stringers_x = aircraft.stringer.x + stringers_z = aircraft.stringer.z denominator = float( len(caps_x) * cap_area + len(stringers_x) * stringer_area) @@ -214,23 +151,94 @@ class Evaluator: area * zDist[_] * (I_z * V_z - I_xz * V_x) / denom) return z - def analysis(self, V_x, V_z): + # def analysis(self, V_x, V_z): + # """Perform all analysis calculations and store in class instance.""" + + # self.drag = self.get_drag(10) + # self.lift_rectangular = self.get_lift_rectangular(13.7) + # self.lift_elliptical = self.get_lift_elliptical(15) + # self.lift_total = self.get_lift_total() + # self.mass_dist = self.get_mass_distribution(self.mass_total) + # self.centroid = self.get_centroid() + # self.I_['x'] = self.get_inertia_terms()[0] + # self.I_['z'] = self.get_inertia_terms()[1] + # self.I_['xz'] = self.get_inertia_terms()[2] + # spar_dx = self.get_dx(self.spar) + # spar_dz = self.get_dz(self.spar) + # self.spar.dP_x = self.get_dP(spar_dx, spar_dz, V_x, 0, + # self.spar.cap_area) + # self.spar.dP_z = self.get_dP(spar_dx, spar_dz, 0, V_z, + # self.spar.cap_area) + # print("yayyyyy") + # return None + + def update(self): + """Get all aircrafts' data.""" + for aircraft in self.tree: + # print(f"For {aircraft.name} tree is:") + # print("For", aircraft.name, " tree is:") + # print(self.tree) + self.results.append(self.analysis(aircraft)) + + def analysis(self, aircraft): """Perform all analysis calculations and store in class instance.""" - self.drag = self.get_drag(10) - self.lift_rectangular = self.get_lift_rectangular(13.7) - self.lift_elliptical = self.get_lift_elliptical(15) - self.lift_total = self.get_lift_total() - self.mass_dist = self.get_mass_distribution(self.mass_total) - self.centroid = self.get_centroid() - self.I_['x'] = self.get_inertia_terms()[0] - self.I_['z'] = self.get_inertia_terms()[1] - self.I_['xz'] = self.get_inertia_terms()[2] - spar_dx = self.get_dx(self.spar) - spar_dz = self.get_dz(self.spar) - self.spar.dP_x = self.get_dP(spar_dx, spar_dz, V_x, 0, - self.spar.cap_area) - self.spar.dP_z = self.get_dP(spar_dx, spar_dz, 0, V_z, - self.spar.cap_area) + + results = { + "Lift": self.get_lift_total, + "Drag": self.get_drag, + "Centroid": self.get_centroid + } + + # print(f"Analysis results for {aircraft.name}:\n", results) + return (results) + # self.results = self.get_lift_total(aircraft) + + # self.drag = self.get_drag(10) + # self.lift_rectangular = self.get_lift_rectangular(13.7) + # self.lift_elliptical = self.get_lift_elliptical(15) + # self.lift_total = self.get_lift_total() + # self.mass_dist = self.get_mass_distribution(self.mass_total) + # self.centroid = self.get_centroid() + # self.I_['x'] = self.get_inertia_terms()[0] + # self.I_['z'] = self.get_inertia_terms()[1] + # self.I_['xz'] = self.get_inertia_terms()[2] + # spar_dx = self.get_dx(self.spar) + # spar_dz = self.get_dz(self.spar) + # self.spar.dP_x = self.get_dP(spar_dx, spar_dz, V_x, 0, + # self.spar.cap_area) + # self.spar.dP_z = self.get_dP(spar_dx, spar_dz, 0, V_z, + # self.spar.cap_area) + return None + + def info_print(self, round): + """Print all the component's evaluated data to the terminal.""" + name = f' {print(self)} DATA FOR {str(self).upper()} ' + num_of_dashes = len(name) + print(num_of_dashes * '-') + print(name) + for k, v in self.__dict__.items(): + if type(v) != list: + print('{}:\n'.format(k), v) + print(num_of_dashes * '-') + for k, v in self.__dict__.items(): + if type(v) == list: + print('{}:\n'.format(k), np.around(v, round)) + return None + + def info_save(self, save_path, number): + """Save all the object's coordinates (must be full path).""" + file_name = 'airfoil_{}_eval.txt'.format(number) + full_path = os.path.join(save_path, file_name) + try: + with open(full_path, 'w') as sys.stdout: + self.info_print(6) + # This line required to reset behavior of sys.stdout + sys.stdout = sys.__stdout__ + print('Successfully wrote to file {}'.format(full_path)) + except IOError: + print( + 'Unable to write {} to specified directory.\n'.format( + file_name), 'Was the full path passed to the function?') return None |