def get_max_cl(Re, r): """ Analyze airfoil at a fixed Re, changing aoa from 10 to 15 by 0.1 and returns cl, cd, aoa that makes maximum cl """ xf = XFoil() if r <= 0.175: xf.airfoil = naca6409 else: xf.airfoil = naca2412 xf.Re = Re xf.Re = Re xf.max_iter = 200 xf.n_crit = 9.00 xf.xtr = [1.00, 1.00] xf.M = 0 a_seq, cl_seq, cd_seq, cm_seq, cp_seq = xf.aseq(10, 15, 0.1) # ignore nan by making it 0 cl_seq = np.nan_to_num(cl_seq) # find the maximum cl cl_maxi = np.max(cl_seq) # index of the maximum cl idx = np.argmax(cl_seq) return round(cl_maxi, 2), round(a_seq[idx], 2), round(cd_seq[idx], 2)
def get_torque(angular_velocity): torque_sum_small = 0 torque_sum_large = 0 w = angular_velocity for key, value in dfdict.items(): value["blade_velocity"] = value['r_position'] * w value["relative_velocity"] = round( math.sqrt(value["blade_velocity"]**2 + value["wind_velocity"]**2), 2) value["arctan"] = math.degrees( math.atan2(value["wind_velocity"], value["blade_velocity"])) aoa = round(value["arctan"] - value["pitch_angle"], 2) value["angle_of_attack"] = aoa re_n = round( value["relative_velocity"] * value["chord_length"] / 0.00001511, 3) value["Reynolds_number"] = re_n xf = XFoil() if key < 13: xf.airfoil = naca6409 else: xf.airfoil = naca2412 xf.Re = re_n xf.max_iter = 100 xf.n_crit = 9.00 xf.xtr = [1.00, 1.00] xf.M = 0 value["Cl"], value["Cd"], value["Cm"], value["Cp"] = xf.a(aoa) force_reference = 0.5 * density * value["relative_velocity"]**2 if math.isnan(value["Cl"]): value["torque"] = 0 else: lift = value["Cl"] * force_reference * 0.0125 * value[ 'chord_length'] drag = value["Cd"] * force_reference * 0.0125 * value[ 'chord_length'] value["torque"] = value["r_position"] * ( lift * math.sin(math.radians(value["pitch_angle"])) - drag * math.cos(math.radians(value["pitch_angle"]))) if key < 13: torque_sum_small += value["torque"] else: pass if key > 0: torque_sum_large += value["torque"] else: pass df2 = pd.DataFrame.from_dict(dfdict, orient="index") df_collection.append(df2) torque_sum_avg = 0.5 * (torque_sum_small + torque_sum_large) return torque_sum_avg
def total_dict(angular_velocity): torque_sum = 0 w = angular_velocity for key, value in dfdict.items(): value["blade_velocity"] = value['r_position'] * w value["relative_velocity"] = round( math.sqrt(value["blade_velocity"]**2 + value["wind_velocity"]**2), 2) value["arctan"] = math.degrees( math.atan2(value["wind_velocity"], value["blade_velocity"])) aoa = round(value["arctan"] - value["pitch_angle"], 1) value["angle_of_attack"] = aoa re_n = round(value["relative_velocity"] * value["chord_length"] / 0.00001511) value["Reynolds_number"] = re_n xf = XFoil() if key < 13: xf.airfoil = naca6409 else: xf.airfoil = naca2412 xf.Re = round(re_n / 100) * 100 xf.max_iter = 200 xf.n_crit = 9.00 xf.xtr = [1.00, 1.00] xf.M = 0 c_l, c_d, c_m, c_p = xf.a(aoa) force_reference = 0.5 * density * value["relative_velocity"]**2 if math.isnan(c_l): pass else: value["Cl"] = c_l value["Cd"] = c_d value["Cm"] = c_m value["Cp"] = c_p lift = c_l * force_reference * 0.0125 * value['chord_length'] drag = c_d * force_reference * 0.0125 * value['chord_length'] value["lift"] = lift value["drag"] = drag # value["torque"] = value["r_position"] * lift * math.sin(math.radians(value["pitch_angle"])) torque = value["r_position"] * ( lift * math.sin(math.radians(value["pitch_angle"])) - drag * math.cos(math.radians(value["pitch_angle"]))) value["torque"] = torque torque_sum += torque xf.reset_bls() # detailed_df = pd.DataFrame.from_dict(dfdict, orient="index") # print(detailed_df) print(torque_sum, angular_velocity) return dfdict, torque_sum
#TODO: CST airfoil for Xfoil cst_u = [ 0.135283, 0.088574, 0.177210, 0.080000, 0.231590, 0.189572, 0.192000] cst_l = [-0.101390, -0.007993, -0.240000, -0.129790, -0.147840, -0.000050, 0.221251] xx, yu, yl, t0, R0 = cst_foil(101, np.array(cst_u), np.array(cst_l), x=None, t=0.0954, tail=0.002) x = np.concatenate((np.flip(xx[1:]), xx[1:]), axis=0) y = np.concatenate((np.flip(yu[1:]), yl[1:]), axis=0) foil = Airfoil(x, y) #TODO: Xfoil xf = XFoil() xf.print = False xf.max_iter = 40 xf.airfoil = foil xf.xtr = [0.0, 0.0] Minf = 0.2 AoA = 8.0 Re = 1e7 fname = 'feature-xfoil.txt' xf.M = Minf xf.Re = Re cl, cd, cm, cp = xf.a(AoA) x, cp = xf.get_cp_distribution() with open(fname, 'w') as f: f.write('%10s %15.6f \n'%('Minf', Minf)) f.write('%10s %15.6f \n'%('AoA', AoA))