def von_mises(x, y, moment_z, moment_y, normal_force, I_zz, I_yy, area, tau_max): """Returns maximum Von Mises stress""" z = sp.width_wingbox(x) / 2 #-my/I according to the formula, makes sense because for a positive Mz the top skin will be in compression moment_z_upperskin = -moment_z * (sp.height_wingbox(x) - abs(y)) / I_zz moment_z_lowerskin = -moment_z * y / I_zz moment_y_rightflange = -moment_y * z / I_yy moment_y_leftflange = -moment_y * -z / I_yy area = sp.cross_sectional_area(x) normal_force_stress = normal_force / area stress_x_lower = moment_z_lowerskin + normal_force_stress stress_x_upper = moment_z_upperskin + normal_force_stress stress_y_right = moment_y_rightflange stress_y_left = moment_y_leftflange vm_ll_1 = (stress_x_lower + stress_y_left) / 2 + np.sqrt(( (stress_x_lower - stress_y_left) / 2)**2 + tau_max**2) vm_ll_2 = (stress_x_lower + stress_y_left) / 2 - np.sqrt(( (stress_x_lower - stress_y_left) / 2)**2 + tau_max**2) vm_ll = np.sqrt(vm_ll_1**2 + vm_ll_2**2 - vm_ll_1 * vm_ll_2 + 3 * tau_max**2) vm_lr_1 = (stress_x_lower + stress_y_right) / 2 + np.sqrt(( (stress_x_lower - stress_y_right) / 2)**2 + tau_max**2) vm_lr_2 = (stress_x_lower + stress_y_right) / 2 - np.sqrt(( (stress_x_lower - stress_y_right) / 2)**2 + tau_max**2) vm_lr = np.sqrt(vm_lr_1**2 + vm_lr_2**2 - vm_lr_1 * vm_lr_2 + 3 * tau_max**2) vm_ur_1 = (stress_x_upper + stress_y_right) / 2 + np.sqrt(( (stress_x_upper - stress_y_right) / 2)**2 + tau_max**2) vm_ur_2 = (stress_x_upper + stress_y_right) / 2 - np.sqrt(( (stress_x_upper - stress_y_right) / 2)**2 + tau_max**2) vm_ur = np.sqrt(vm_ur_1**2 + vm_ur_2**2 - vm_ur_1 * vm_ur_2 + 3 * tau_max**2) vm_ul_1 = (stress_x_upper + stress_y_left) / 2 + np.sqrt(( (stress_x_upper - stress_y_left) / 2)**2 + tau_max**2) vm_ul_2 = (stress_x_upper + stress_y_left) / 2 - np.sqrt(( (stress_x_upper - stress_y_left) / 2)**2 + tau_max**2) vm_ul = np.sqrt(vm_ul_1**2 + vm_ul_2**2 - vm_ul_1 * vm_ul_2 + 3 * tau_max**2) return vm_ll, vm_lr, vm_ur, vm_ul
def normal_stress(x,y,moment_z,moment_y,normal_force,I_zz,I_yy,area): """Returns bending moment and normal force stress""" z = sp.width_wingbox(x)/2 #-my/I according to the formula, makes sense because for a positive Mz the top skin will be in compression moment_z_upperskin = -moment_z*(sp.height_wingbox(x)-abs(y))/I_zz moment_z_lowerskin = -moment_z*y/I_zz moment_y_rightflange = -moment_y*z/I_yy moment_y_leftflange = -moment_y*-z/I_yy area = sp.cross_sectional_area(x) normal_force_stress = normal_force/area normal_ru = moment_z_upperskin + moment_y_rightflange + normal_force_stress normal_lu = moment_z_upperskin + moment_y_leftflange + normal_force_stress normal_rl = moment_z_lowerskin + moment_y_rightflange + normal_force_stress normal_ll = moment_z_lowerskin + moment_y_leftflange + normal_force_stress # if max(normal_ru,normal_lu,normal_rl,normal_ll) == normal_ru: # print("Max tension at right upper corner") # elif max(normal_ru,normal_lu,normal_rl,normal_ll) == normal_lu: # print("Max tension at left upper corner") # elif max(normal_ru,normal_lu,normal_rl,normal_ll) == normal_rl: # print("Max tension at right lower corner") # elif max(normal_ru,normal_lu,normal_rl,normal_ll) == normal_ll: # print("Max tension at left lower corner") # # # if min(normal_ru,normal_lu,normal_rl,normal_ll) == normal_ru: # print("Max compression at right upper corner") # elif min(normal_ru,normal_lu,normal_rl,normal_ll) == normal_lu: # print("Max compression at left upper corner") # elif min(normal_ru,normal_lu,normal_rl,normal_ll) == normal_rl: # print("Max compression at right lower corner") # elif min(normal_ru,normal_lu,normal_rl,normal_ll) == normal_ll: # print("Max compression at left lower corner") # # # print("x: ",x) # print("Neutral axis: y =",sp.centroid_y(x),"(",sp.centroid_y(x)/sp.height_wingbox(x)*100,"%)",) # print("Maximum tension: ",max(normal_ru,normal_lu,normal_rl,normal_ll)/10**6,"MPa") # print("Maximum compression: ", min(normal_ru,normal_lu,normal_rl,normal_ll)/10**6,"MPa") # print("Normal force stress: ",normal_force_stress,"MPa") # print("") return normal_ru,normal_lu,normal_rl,normal_ll
perc_engine = p.engine_pos_perc perc_strut = p.strut_pos_perc perc_pod = p.pod_pos_perc di = p.b / 2 / lengthdata xi = np.zeros(lengthdata + 1) for i in range(len(xi)): xi[i] = i * di hi = [] bi = [] t = p.t_sheet Izz = [] Iyy = [] for i in range(len(xi)): hi.append(height_wingbox(xi[i])) bi.append(width_wingbox(xi[i])) Izz.append(I_zz_wingbox(xi[i])) Iyy.append(I_yy_wingbox(xi[i])) Lift, Chord, Yle, Drag, AeroMoment = read_aero_data("wing/datastrut4.txt", lengthdata, V_cruise, rho_cruise) Frx, Fry, Fs, Mrz, Frz, Fsz, Mry, momentyi, momentzi, shearyi, shearzi, vyi, vny, vzi, vnz, xi, theta = CallForces( Lift, Yle, Drag, tot_thrust, Iyy, Izz, p.E_al2014, perc_engine, perc_strut, perc_pod) lengthdata = len(Lift) b = p.b taumax = max_shear_stress(Lift, Drag, AeroMoment, Chord, shearyi, shearzi, hi, bi, Izz, Iyy)
Izz_list = [] Iyy_list = [] first_moment_of_area_list = [] area_list = [] y_max_list = [] hi = [] bi = [] for x in x_pos: Izz_list.append(sp.I_zz_wingbox(x)) Iyy_list.append(sp.I_yy_wingbox(x)) first_moment_of_area_list.append(sp.first_moment_of_area_y(x)) area_list.append(sp.cross_sectional_area(x)) y_max_list.append(sp.y_max(x)) hi.append(sp.height_wingbox(x)) bi.append(sp.width_wingbox(x)) lengthdata = 100 Lift, Chord, Yle, Drag, AeroMoment = read_aero_data("wing/datastrut5.txt", lengthdata, V_cruise, rho_cruise) Frx, Fry, Fs, Mrz, Frz, Fsz, Mry, momentyi, momentzi, shearyi, shearzi, vyi, vny, vzi, vnz, xi, theta = CallForces(Lift, Yle, Drag, tot_thrust, Iyy_list, Izz_list , 70*10**9, perc_engine, perc_strut, perc_pod) Forces1 = [['Frx = ', Frx], ['Fry = ', Fry], ['Fs = ', Fs], ['Mr = ', Mrz]] Forces2 = [['Frz = ', Frz], ['Fsz = ', Fsz], ['Mry = ', Mry]] #TESTING ### NORMAL STRESS CALCULATOR ### def normal_stress(x,y,moment_z,moment_y,normal_force,I_zz,I_yy,area): """Returns bending moment and normal force stress"""