diff --git a/wetb/hawc2/bladeinfo.py b/wetb/hawc2/blade.py similarity index 66% rename from wetb/hawc2/bladeinfo.py rename to wetb/hawc2/blade.py index e89bd9ab10c5d3619f38b442870bf0e115250cd8..2e323a52dc3972e3a7dbb18956ed33395b766926 100644 --- a/wetb/hawc2/bladeinfo.py +++ b/wetb/hawc2/blade.py @@ -11,6 +11,8 @@ from scipy.interpolate.interpolate import interp1d import os from wetb.utils.geometry import rad from wetb.hawc2.st_file import StFile +from wetb.hawc2.ae_file import AEFile +from wetb.hawc2.mainbody import MainBody @@ -61,7 +63,7 @@ from wetb.hawc2.st_file import StFile # """ -class H2aeroBladeInfo(PCFile, AtTimeFile): +class H2aeroBlade(PCFile, AEFile, AtTimeFile): """Provide HAWC2 info about a blade From AE file: @@ -86,36 +88,37 @@ class H2aeroBladeInfo(PCFile, AtTimeFile): """ - def __init__(self, htcfile, ae_filename=None, pc_filename=None, at_time_filename=None, blade_name=None): - - if isinstance(htcfile, str): - assert htcfile.lower().endswith('.htc') - htcfile = HTCFile(htcfile) - self.htcfile = htcfile - blade_name = blade_name or htcfile.aero.link[2] - #s = htcfile.new_htc_structure - at_time_filename = at_time_filename or ("output_at_time" in htcfile and os.path.join(htcfile.modelpath, htcfile.output_at_time.filename[0] + ".dat")) - pc_filename = pc_filename or os.path.join(htcfile.modelpath, htcfile.aero.pc_filename[0]) - ae_filename = ae_filename or os.path.join(htcfile.modelpath, htcfile.aero.ae_filename[0]) - + def __init__(self, htcfile=None, ae_filename=None, pc_filename=None, at_time_filename=None, blade_name=None): + if htcfile: + if isinstance(htcfile, str): + assert htcfile.lower().endswith('.htc') + htcfile = HTCFile(htcfile) + self.htcfile = htcfile + blade_name = blade_name or htcfile.aero.link[2] + at_time_filename = at_time_filename or ("output_at_time" in htcfile and os.path.join(htcfile.modelpath, htcfile.output_at_time.filename[0] + ".dat")) + pc_filename = pc_filename or os.path.join(htcfile.modelpath, htcfile.aero.pc_filename[0]) + ae_filename = ae_filename or os.path.join(htcfile.modelpath, htcfile.aero.ae_filename[0]) + self.hawc2_splines_data = self.hawc2_splines() + #mainbodies = [s[k] for k in s.keys() if s[k].name_ == "main_body"] #self.mainbody_blade = [mb for mb in mainbodies if mb.name[0] == blade_name][0] if os.path.isfile(pc_filename) and os.path.isfile(ae_filename): - PCFile.__init__(self, pc_filename, ae_filename) + AEFile.__init__(self, ae_filename) + PCFile.__init__(self, pc_filename) blade_radius = self.ae_sets[1][-1,0] - if os.path.isfile(at_time_filename): + if at_time_filename and os.path.isfile(at_time_filename): AtTimeFile.__init__(self, at_time_filename, blade_radius) self.curved_length = self.radius_curved_ac()[-1] else: - raise NotImplementedError + self.curved_length = None #z_nd = (np.cos(np.linspace(np.pi, np.pi*2,len(curved_length)-1))+1)/2 #self.curved_length = np.cumsum(np.sqrt(np.sum(np.diff(self.c2def[:, :3], 1, 0) ** 2, 1)))[-1] - self.hawc2_splines_data = self.hawc2_splines() + @property @@ -222,8 +225,103 @@ class H2aeroBladeInfo(PCFile, AtTimeFile): assert np.all(l>=self.c2def[0,2]) and np.all(l<=self.c2def[-1,2]) return self.c2nd(l/self.c2def[-1, 2]) + def _Cxxx(self, radius, alpha, column, ae_set_nr=1): + thickness = self.thickness(radius, ae_set_nr) + pc_set_nr = self.pc_set_nr(radius, ae_set_nr) + thicknesses, profiles = self.pc_sets[pc_set_nr] + index = np.searchsorted(thicknesses, thickness) + if index == 0: + index = 1 + + Cx0, Cx1 = profiles[index - 1:index + 1] + Cx0 = np.interp(alpha, Cx0[:, 0], Cx0[:, column]) + Cx1 = np.interp(alpha, Cx1[:, 0], Cx1[:, column]) + th0, th1 = thicknesses[index - 1:index + 1] + return Cx0 + (Cx1 - Cx0) * (thickness - th0) / (th1 - th0) + + def _CxxxH2(self, radius, alpha, column, ae_set_nr=1): + thickness = self.thickness(radius, ae_set_nr) + pc_set_nr = self.pc_set_nr(radius, ae_set_nr) + thicknesses, profiles = self.pc_sets[pc_set_nr] + index = np.searchsorted(thicknesses, thickness) + if index == 0: + index = 1 + + Cx0, Cx1 = profiles[index - 1:index + 1] + + Cx0 = np.interp(np.arange(360), Cx0[:,0]+180, Cx0[:,column]) + Cx1 = np.interp(np.arange(360), Cx1[:,0]+180, Cx1[:,column]) + #Cx0 = np.interp(alpha, Cx0[:, 0], Cx0[:, column]) + #Cx1 = np.interp(alpha, Cx1[:, 0], Cx1[:, column]) + th0, th1 = thicknesses[index - 1:index + 1] + cx = Cx0 + (Cx1 - Cx0) * (thickness - th0) / (th1 - th0) + return np.interp(alpha+180, np.arange(360), cx) + + + + def CL(self, radius, alpha, ae_set_nr=1): + """Lift coefficient + + Parameters + --------- + radius : float + radius [m] + alpha : float + Angle of attack [deg] + ae_set_nr : int optional + Aerdynamic set number, default is 1 + + Returns + ------- + Lift coefficient : float + """ + return self._Cxxx(radius, alpha, 1, ae_set_nr) + + + def CL_H2(self, radius, alpha, ae_set_nr=1): + return self._CxxxH2(radius, alpha, 1, ae_set_nr) + + def CD(self, radius, alpha, ae_set_nr=1): + """Drag coefficient + + Parameters + --------- + radius : float + radius [m] + alpha : float + Angle of attack [deg] + ae_set_nr : int optional + Aerdynamic set number, default is 1 + + Returns + ------- + Drag coefficient : float + """ + return self._Cxxx(radius, alpha, 2, ae_set_nr) + + def CM(self, radius, alpha, ae_set_nr=1): + return self._Cxxx(radius, alpha, 3, ae_set_nr) -class H2BladeInfo(H2aeroBladeInfo): + + def plot_xz_geometry(self, plt): + + z = np.linspace(self.c2def[0, 2], self.c2def[-1, 2], 100) + plt.plot(z, np.interp(z, self.c2def[:, 2], self.c2def[:, 0]), label='Center line') + plt.plot(z, np.interp(z, self.c2def[:, 2], self.c2def[:, 0]) + self.chord(z) / 2, label='Leading edge') + plt.plot(z, np.interp(z, self.c2def[:, 2], self.c2def[:, 0]) - self.chord(z) / 2, label="Trailing edge") + curve_l_nd, x, y, z, twist = self.hawc2_splines() + plt.plot(z, x, label='Hawc2spline') + + def plot_yz_geometry(self, plt): + + z = np.linspace(self.c2def[0, 2], self.c2def[-1, 2], 100) + plt.plot(z, np.interp(z, self.c2def[:, 2], self.c2def[:, 1]), label='Center line') + plt.plot(z, np.interp(z, self.c2def[:, 2], self.c2def[:, 1]) + self.thickness(z) / 100 * self.chord(z) / 2, label='Suction side') + plt.plot(z, np.interp(z, self.c2def[:, 2], self.c2def[:, 1]) - self.thickness(z) / 100 * self.chord(z) / 2, label="Pressure side") + curve_l_nd, x, y, z, twist = self.hawc2_splines() + plt.plot(z, y, label='Hawc2spline') + +class H2Blade(H2aeroBlade, MainBody): """Provide HAWC2 info about a blade From AE file: @@ -247,19 +345,24 @@ class H2BladeInfo(H2aeroBladeInfo): with template """ - def __init__(self, htcfile, ae_filename=None, pc_filename=None, at_time_filename=None, st_filename=None, blade_name=None): - if isinstance(htcfile, str): - htcfile = HTCFile(htcfile) - s = htcfile.new_htc_structure + def __init__(self, htcfile=None, ae_filename=None, pc_filename=None, at_time_filename=None, st_filename=None, blade_name=None): + if htcfile is not None: + if isinstance(htcfile, str): + htcfile = HTCFile(htcfile) + s = htcfile.new_htc_structure # at_time_filename = at_time_filename or ("output_at_time" in htcfile and os.path.join(htcfile.modelpath, htcfile.output_at_time.filename[0] + ".dat")) # pc_filename = pc_filename or os.path.join(htcfile.modelpath, htcfile.aero.pc_filename[0]) # ae_filename = ae_filename or os.path.join(htcfile.modelpath, htcfile.aero.ae_filename[0]) # - mainbodies = [s[k] for k in s.keys() if s[k].name_ == "main_body"] - if blade_name is None: - blade_name = htcfile.aero.link[2] - self.mainbody_blade = [mb for mb in mainbodies if mb.name[0] == blade_name][0] - H2aeroBladeInfo.__init__(self, htcfile, ae_filename=ae_filename, pc_filename=pc_filename, at_time_filename=at_time_filename, blade_name=blade_name) + mainbodies = [s[k] for k in s.keys() if s[k].name_ == "main_body"] + if blade_name is None: + blade_name = htcfile.aero.link[2] + self.mainbody_blade = htcfile.new_htc_structure.get_subsection_by_name(blade_name) + st_filename = st_filename or os.path.join(htcfile.modelpath, self.mainbody_blade.timoschenko_input.filename[0]) + MainBody.__init__(self, htcfile, blade_name) + elif st_filename and os.path.isfile(st_filename): + StFile.__init__(self, st_filename) + H2aeroBlade.__init__(self, htcfile, ae_filename=ae_filename, pc_filename=pc_filename, at_time_filename=at_time_filename, blade_name=blade_name) # def __init__(self, htcfile, ae_filename=None, pc_filename=None, at_time_filename=None, st_filename=None, blade_name=None): # @@ -268,14 +371,12 @@ class H2BladeInfo(H2aeroBladeInfo): # htcfile = HTCFile(htcfile) # # blade_name = blade_name or htcfile.aero.link[2] - st_filename = st_filename or os.path.join(htcfile.modelpath, self.mainbody_blade.timoschenko_input.filename[0]) # # if os.path.isfile(pc_filename) and os.path.isfile(ae_filename): # PCFile.__init__(self, pc_filename, ae_filename) # blade_radius = self.ae_sets[1][-1,0] -# - if os.path.isfile(st_filename): - StFile.__init__(self, st_filename) +# + # if os.path.isfile(at_time_filename): # AtTimeFile.__init__(self, at_time_filename, blade_radius) # self.curved_length = self.radius_curved_ac()[-1] @@ -287,6 +388,7 @@ class H2BladeInfo(H2aeroBladeInfo): # self.c2def = np.array([v.values[1:5] for v in mainbody_blade.c2_def if v.name_ == "sec"]) # # self.hawc2_splines_data = self.hawc2_splines() + @property def c2def(self): if not hasattr(self, "_c2def"): @@ -294,7 +396,7 @@ class H2BladeInfo(H2aeroBladeInfo): return self._c2def # -# class H2aeroBladeInfo(H2BladeInfo): +# class H2aeroBlade(H2Blade): # # def __init__(self, at_time_filename, ae_filename, pc_filename, htc_filename): # """ diff --git a/wetb/hawc2/mainbody.py b/wetb/hawc2/mainbody.py index 0744294d0b2aefb591f8ee0fd61776ea66ded8fe..c74a15c10ef7ecbf47ad36a923fed85412560192 100644 --- a/wetb/hawc2/mainbody.py +++ b/wetb/hawc2/mainbody.py @@ -12,14 +12,23 @@ from wetb.hawc2.st_file import StFile class MainBody(): - def __init__(self, htc_filename, modelpath, body_name): - self.htcfile = htcfile = HTCFile(htc_filename, modelpath) + def __init__(self, htcfile, body_name): + if isinstance(htcfile, str): + htcfile = HTCFile(htcfile) + self.htcfile = htcfile s = htcfile.new_htc_structure main_bodies = {s[k].name[0]:s[k] for k in s.keys() if s[k].name_ == "main_body"} self.main_body = main_bodies[body_name] + self.main_body = s.get_subsection_by_name(body_name) self.stFile = StFile(os.path.join(htcfile.modelpath, self.main_body.timoschenko_input.filename[0])) - self.c2def = np.array([v.values[1:5] for v in self.main_body.c2_def if v.name_ == "sec"]) + #self.c2def = np.array([v.values[1:5] for v in self.main_body.c2_def if v.name_ == "sec"]) self.concentrated_mass = [cm.values for cm in self.main_body if cm.name_.startswith('concentrated_mass')] + + @property + def c2def(self): + if not hasattr(self, "_c2def"): + self._c2def = np.array([v.values[1:5] for v in self.main_body.c2_def if v.name_ == "sec"]) + return self._c2def def plot_xz_geometry(self, plt=None): if plt is None: @@ -43,7 +52,7 @@ class MainBody(): plt.xlabel("z") plt.ylabel("y") z = np.linspace(self.c2def[0, 2], self.c2def[-1, 2], 100) - plt.plot(self.c2def[:, 2], self.c2def[:, 1], label='Center line') + plt.plot(self.c2def[:, 2], self.c2def[:, 1], '.-', label='Center line') plt.plot(z, np.interp(z, self.c2def[:, 2], self.c2def[:, 1]) + self.stFile.y_e(z), label='Elastic center') plt.plot(z, np.interp(z, self.c2def[:, 2], self.c2def[:, 1]) + self.stFile.y_cg(z), label='Mass center') plt.plot(z, np.interp(z, self.c2def[:, 2], self.c2def[:, 1]) + self.stFile.y_sh(z), label='Shear center') @@ -52,106 +61,106 @@ class MainBody(): plt.legend() - - -class BladeData(object): - def plot_xz_geometry(self, plt): - - z = np.linspace(self.c2def[0, 2], self.c2def[-1, 2], 100) - plt.plot(z, np.interp(z, self.c2def[:, 2], self.c2def[:, 0]), label='Center line') - plt.plot(z, np.interp(z, self.c2def[:, 2], self.c2def[:, 0]) + self.pcFile.chord(z) / 2, label='Leading edge') - plt.plot(z, np.interp(z, self.c2def[:, 2], self.c2def[:, 0]) - self.pcFile.chord(z) / 2, label="Trailing edge") - x, y, z = self.hawc2_splines() - #plt.plot(z, x, label='Hawc2spline') - - def plot_yz_geometry(self, plt): - - z = np.linspace(self.c2def[0, 2], self.c2def[-1, 2], 100) - plt.plot(z, np.interp(z, self.c2def[:, 2], self.c2def[:, 1]), label='Center line') - plt.plot(z, np.interp(z, self.c2def[:, 2], self.c2def[:, 1]) + self.pcFile.thickness(z) / 100 * self.pcFile.chord(z) / 2, label='Suction side') - plt.plot(z, np.interp(z, self.c2def[:, 2], self.c2def[:, 1]) - self.pcFile.thickness(z) / 100 * self.pcFile.chord(z) / 2, label="Pressure side") - x, y, z = self.hawc2_splines() - #plt.plot(z, y, label='Hawc2spline') - - def hawc2_splines(self): - curve_z = np.r_[0, np.cumsum(np.sqrt(np.sum(np.diff(self.c2def[:, :3], 1, 0) ** 2, 1)))] - curve_z_nd = curve_z / curve_z[-1] - - def akima(x, y): - n = len(x) - var = np.zeros((n + 3)) - z = np.zeros((n)) - co = np.zeros((n, 4)) - for i in range(n - 1): - var[i + 2] = (y[i + 1] - y[i]) / (x[i + 1] - x[i]) - var[n + 1] = 2 * var[n] - var[n - 1] - var[n + 2] = 2 * var[n + 1] - var[n] - var[1] = 2 * var[2] - var[3] - var[0] = 2 * var[1] - var[2] - - for i in range(n): - wi1 = abs(var[i + 3] - var[i + 2]) - wi = abs(var[i + 1] - var[i]) - if (wi1 + wi) == 0: - z[i] = (var[i + 2] + var[i + 1]) / 2 - else: - z[i] = (wi1 * var[i + 1] + wi * var[i + 2]) / (wi1 + wi) - - for i in range(n - 1): - dx = x[i + 1] - x[i] - a = (z[i + 1] - z[i]) * dx - b = y[i + 1] - y[i] - z[i] * dx - co[i, 0] = y[i] - co[i, 1] = z[i] - co[i, 2] = (3 * var[i + 2] - 2 * z[i] - z[i + 1]) / dx - co[i, 3] = (z[i] + z[i + 1] - 2 * var[i + 2]) / dx ** 2 - co[n - 1, 0] = y[n - 1] - co[n - 1, 1] = z[n - 1] - co[n - 1, 2] = 0 - co[n - 1, 3] = 0 - return co - - def coef2spline(s, co): - x, y = [], [] - for i, c in enumerate(co.tolist()[:-1]): - p = np.poly1d(c[::-1]) - z = np.linspace(0, s[i + 1] - s[i ], 10) - x.extend(s[i] + z) - y.extend(p(z)) - return y - - x, y, z = [coef2spline(curve_z_nd, akima(curve_z_nd, self.c2def[:, i])) for i in range(3)] - return x, y, z - - - -class Blade(MainBody, BladeData): - def __init__(self, htc_filename, modelpath=None, blade_number=1): - - self.htcfile = htcfile = HTCFile(htc_filename, modelpath) - - blade_name = [link[2] for link in htcfile.aero if link.name_.startswith('link') and link[0]==blade_number][0] - MainBody.__init__(self, htc_filename, modelpath, blade_name) - self.pcFile = PCFile(os.path.join(htcfile.modelpath, htcfile.aero.pc_filename[0]), - os.path.join(htcfile.modelpath, htcfile.aero.ae_filename[0])) - - def plot_xz_geometry(self, plt=None): - if plt is None: - import matplotlib.pyplot as plt - plt.figure() - - MainBody.plot_xz_geometry(self, plt) - BladeData.plot_xz_geometry(self, plt=plt) - plt.legend() - - def plot_geometry_yz(self, plt=None): - if plt is None: - import matplotlib.pyplot as plt - plt.figure() - - BladeData.plot_yz_geometry(self, plt=plt) - MainBody.plot_yz_geometry(self, plt) - +# +# +# class BladeData(object): +# def plot_xz_geometry(self, plt): +# +# z = np.linspace(self.c2def[0, 2], self.c2def[-1, 2], 100) +# plt.plot(z, np.interp(z, self.c2def[:, 2], self.c2def[:, 0]), label='Center line') +# plt.plot(z, np.interp(z, self.c2def[:, 2], self.c2def[:, 0]) + self.pcFile.chord(z) / 2, label='Leading edge') +# plt.plot(z, np.interp(z, self.c2def[:, 2], self.c2def[:, 0]) - self.pcFile.chord(z) / 2, label="Trailing edge") +# x, y, z = self.hawc2_splines() +# #plt.plot(z, x, label='Hawc2spline') +# +# def plot_yz_geometry(self, plt): +# +# z = np.linspace(self.c2def[0, 2], self.c2def[-1, 2], 100) +# plt.plot(z, np.interp(z, self.c2def[:, 2], self.c2def[:, 1]), label='Center line') +# plt.plot(z, np.interp(z, self.c2def[:, 2], self.c2def[:, 1]) + self.pcFile.thickness(z) / 100 * self.pcFile.chord(z) / 2, label='Suction side') +# plt.plot(z, np.interp(z, self.c2def[:, 2], self.c2def[:, 1]) - self.pcFile.thickness(z) / 100 * self.pcFile.chord(z) / 2, label="Pressure side") +# x, y, z = self.hawc2_splines() +# #plt.plot(z, y, label='Hawc2spline') +# +# def hawc2_splines(self): +# curve_z = np.r_[0, np.cumsum(np.sqrt(np.sum(np.diff(self.c2def[:, :3], 1, 0) ** 2, 1)))] +# curve_z_nd = curve_z / curve_z[-1] +# +# def akima(x, y): +# n = len(x) +# var = np.zeros((n + 3)) +# z = np.zeros((n)) +# co = np.zeros((n, 4)) +# for i in range(n - 1): +# var[i + 2] = (y[i + 1] - y[i]) / (x[i + 1] - x[i]) +# var[n + 1] = 2 * var[n] - var[n - 1] +# var[n + 2] = 2 * var[n + 1] - var[n] +# var[1] = 2 * var[2] - var[3] +# var[0] = 2 * var[1] - var[2] +# +# for i in range(n): +# wi1 = abs(var[i + 3] - var[i + 2]) +# wi = abs(var[i + 1] - var[i]) +# if (wi1 + wi) == 0: +# z[i] = (var[i + 2] + var[i + 1]) / 2 +# else: +# z[i] = (wi1 * var[i + 1] + wi * var[i + 2]) / (wi1 + wi) +# +# for i in range(n - 1): +# dx = x[i + 1] - x[i] +# a = (z[i + 1] - z[i]) * dx +# b = y[i + 1] - y[i] - z[i] * dx +# co[i, 0] = y[i] +# co[i, 1] = z[i] +# co[i, 2] = (3 * var[i + 2] - 2 * z[i] - z[i + 1]) / dx +# co[i, 3] = (z[i] + z[i + 1] - 2 * var[i + 2]) / dx ** 2 +# co[n - 1, 0] = y[n - 1] +# co[n - 1, 1] = z[n - 1] +# co[n - 1, 2] = 0 +# co[n - 1, 3] = 0 +# return co +# +# def coef2spline(s, co): +# x, y = [], [] +# for i, c in enumerate(co.tolist()[:-1]): +# p = np.poly1d(c[::-1]) +# z = np.linspace(0, s[i + 1] - s[i ], 10) +# x.extend(s[i] + z) +# y.extend(p(z)) +# return y +# +# x, y, z = [coef2spline(curve_z_nd, akima(curve_z_nd, self.c2def[:, i])) for i in range(3)] +# return x, y, z + + + +# class Blade(MainBody, BladeData): +# def __init__(self, htc_filename, modelpath=None, blade_number=1): +# +# self.htcfile = htcfile = HTCFile(htc_filename, modelpath) +# +# blade_name = [link[2] for link in htcfile.aero if link.name_.startswith('link') and link[0]==blade_number][0] +# MainBody.__init__(self, htc_filename, modelpath, blade_name) +# self.pcFile = PCFile(os.path.join(htcfile.modelpath, htcfile.aero.pc_filename[0]), +# os.path.join(htcfile.modelpath, htcfile.aero.ae_filename[0])) +# +# def plot_xz_geometry(self, plt=None): +# if plt is None: +# import matplotlib.pyplot as plt +# plt.figure() +# +# MainBody.plot_xz_geometry(self, plt) +# BladeData.plot_xz_geometry(self, plt=plt) +# plt.legend() +# +# def plot_geometry_yz(self, plt=None): +# if plt is None: +# import matplotlib.pyplot as plt +# plt.figure() +# +# BladeData.plot_yz_geometry(self, plt=plt) +# MainBody.plot_yz_geometry(self, plt) +# diff --git a/wetb/hawc2/pc_file.py b/wetb/hawc2/pc_file.py index 301a5b81ab93840138ae5a6326e3f198ceb0c093..84b15cc033f81591bed374236cd1be6958b0d652 100644 --- a/wetb/hawc2/pc_file.py +++ b/wetb/hawc2/pc_file.py @@ -16,7 +16,7 @@ standard_library.install_aliases() from wetb.hawc2.ae_file import AEFile import numpy as np -class PCFile(AEFile): +class PCFile(object): """Read HAWC2 PC (profile coefficients) file examples @@ -37,9 +37,7 @@ class PCFile(AEFile): >>> pcfile.CM(36,10) # CM at radius=36m and AOA=10deg -0.1103 """ - def __init__(self, filename, ae_filename): - AEFile.__init__(self, ae_filename) - + def __init__(self, filename): with open (filename) as fid: lines = fid.readlines() nsets = int(lines[0].split()[0]) @@ -61,9 +59,7 @@ class PCFile(AEFile): lptr += n_rows self.pc_sets[nset] = (np.array(thicknesses), profiles) - def _Cxxx(self, radius, alpha, column, ae_set_nr=1): - thickness = self.thickness(radius, ae_set_nr) - pc_set_nr = self.pc_set_nr(radius, ae_set_nr) + def _Cxxx(self, thickness, alpha, column, ae_set_nr=1, pc_set_nr=1): thicknesses, profiles = self.pc_sets[pc_set_nr] index = np.searchsorted(thicknesses, thickness) if index == 0: @@ -75,9 +71,7 @@ class PCFile(AEFile): th0, th1 = thicknesses[index - 1:index + 1] return Cx0 + (Cx1 - Cx0) * (thickness - th0) / (th1 - th0) - def _CxxxH2(self, radius, alpha, column, ae_set_nr=1): - thickness = self.thickness(radius, ae_set_nr) - pc_set_nr = self.pc_set_nr(radius, ae_set_nr) + def _CxxxH2(self, thickness, alpha, column, ae_set_nr=1,pc_set_nr=1): thicknesses, profiles = self.pc_sets[pc_set_nr] index = np.searchsorted(thicknesses, thickness) if index == 0: @@ -95,13 +89,13 @@ class PCFile(AEFile): - def CL(self, radius, alpha, ae_set_nr=1): + def CL(self, thickness, alpha, ae_set_nr=1,pc_set_nr=1): """Lift coefficient Parameters --------- - radius : float - radius [m] + thickness : float + thickness [5] alpha : float Angle of attack [deg] ae_set_nr : int optional @@ -111,13 +105,13 @@ class PCFile(AEFile): ------- Lift coefficient : float """ - return self._Cxxx(radius, alpha, 1, ae_set_nr) + return self._Cxxx(thickness, alpha, 1, ae_set_nr, pc_set_nr) - def CL_H2(self, radius, alpha, ae_set_nr=1): - return self._CxxxH2(radius, alpha, 1, ae_set_nr) + def CL_H2(self, thickness, alpha, ae_set_nr=1, pc_set_nr=1): + return self._CxxxH2(thickness, alpha, 1, ae_set_nr, pc_set_nr) - def CD(self, radius, alpha, ae_set_nr=1): + def CD(self, thickness, alpha, ae_set_nr=1, pc_set_nr=1): """Drag coefficient Parameters @@ -133,10 +127,10 @@ class PCFile(AEFile): ------- Drag coefficient : float """ - return self._Cxxx(radius, alpha, 2, ae_set_nr) + return self._Cxxx(thickness, alpha, 2, ae_set_nr, pc_set_nr) - def CM(self, radius, alpha, ae_set_nr=1): - return self._Cxxx(radius, alpha, 3, ae_set_nr) + def CM(self, thickness, alpha, ae_set_nr=1, pc_set_nr=1): + return self._Cxxx(thickness, alpha, 3, ae_set_nr,pc_set_nr) if __name__ == "__main__": pc = PCFile(r"C:\mmpe\Projects\inflow\Hawc2aero_setup/data/Hawc_pc.b52", r"C:\mmpe\Projects\inflow\Hawc2aero_setup/data/S36_ae_h2.001") diff --git a/wetb/hawc2/tests/test_blade.py b/wetb/hawc2/tests/test_blade.py new file mode 100644 index 0000000000000000000000000000000000000000..68258df17e38c6e2d6945ca8cacc3f85c743cf13 --- /dev/null +++ b/wetb/hawc2/tests/test_blade.py @@ -0,0 +1,48 @@ +''' +Created on 3. maj 2017 + +@author: mmpe +''' +import os +import unittest + +from wetb.hawc2.blade import H2Blade +import numpy as np + +tfp = os.path.join(os.path.dirname(__file__), 'test_files/') # test file path +class Test(unittest.TestCase): + + +# def testBladeInfo(self): +# bi = H2Blade(tfp + "simulation_setup/DTU10MWRef6.0/htc/DTU_10MW_RWT.htc") +# if 0: +# import matplotlib.pyplot as plt +# print (dir(bi)) +# #print (bi.radius_s()) +# plt.plot(bi.radius_s(), bi.twist()) +# plt.plot(bi.c2def[:,2], bi.c2def[:,3]) +# x = np.linspace(0,1,1000) +# plt.plot(bi.blade_radius*x, bi.c2nd(x)[:,3]) +# plt.show() + + + def testBladeInfo_AE(self): + bi = H2Blade(None, tfp + "NREL_5MW_ae.txt", tfp + "NREL_5MW_pc.txt") + self.assertEqual(bi.thickness(32), 23.78048780487805) + self.assertEqual(bi.chord(32), 3.673) + self.assertEqual(bi.pc_set_nr(32), 1) + + def testBladeInfo_PC_AE(self): + bi = H2Blade(None, tfp + "NREL_5MW_ae.txt", tfp + "NREL_5MW_pc.txt") + self.assertEqual(bi.CL(36, 10), 1.358) + self.assertEqual(bi.CD(36, 10), 0.0255) + self.assertEqual(bi.CM(36, 10), -0.1103) + +# def test_curved_length2radius(self): +# bi = H2BladeInfo(tfp + "simulation_setup/DTU10MWRef6.0/htc/DTU_10MW_RWT.htc") +# np.testing.assert_array_equal(bi.xyztwist(86.4979, curved_length=True), bi.xyztwist(86.3655)) + + +if __name__ == "__main__": + #import sys;sys.argv = ['', 'Test.testBladeInfo'] + unittest.main() \ No newline at end of file diff --git a/wetb/hawc2/tests/test_main_body.py b/wetb/hawc2/tests/test_main_body.py index 4ddfec213e863ea537af6e0504dc4b1dd2a3fe3d..04b7a9358d1684196f03e280282091652521767e 100644 --- a/wetb/hawc2/tests/test_main_body.py +++ b/wetb/hawc2/tests/test_main_body.py @@ -5,13 +5,14 @@ Created on 01/08/2016 ''' import unittest import os -from wetb.hawc2.mainbody import MainBody, Blade +from wetb.hawc2.mainbody import MainBody +from wetb.hawc2.blade import H2Blade tfp = os.path.join(os.path.dirname(__file__), 'test_files/') # test file path class TestMainBody(unittest.TestCase): def test_MainBody(self): - mainbody = MainBody(tfp+"htcfiles/test.htc", "../", "towertop") + mainbody = MainBody(tfp+"htcfiles/test.htc", "blade1") if 0: import matplotlib.pyplot as plt plt.figure() @@ -21,7 +22,7 @@ class TestMainBody(unittest.TestCase): plt.show() def test_Blade(self): - blade = Blade(tfp+"htcfiles/test.htc", "../") + blade = H2Blade(tfp+"htcfiles/test.htc") if 0: import matplotlib.pyplot as plt plt.figure() diff --git a/wetb/hawc2/tests/test_pc_file.py b/wetb/hawc2/tests/test_pc_file.py index e5a7027925477f7341190ea7a0c626cca1b74a5a..0ac9e5b87d0f2b182be61a88807db88a81e8ec58 100644 --- a/wetb/hawc2/tests/test_pc_file.py +++ b/wetb/hawc2/tests/test_pc_file.py @@ -8,6 +8,7 @@ from __future__ import print_function from __future__ import division from __future__ import absolute_import from future import standard_library +from wetb.hawc2.ae_file import AEFile standard_library.install_aliases() import os import unittest @@ -24,19 +25,13 @@ class TestPCFile(unittest.TestCase): unittest.TestCase.setUp(self) self.testfilepath = os.path.join(os.path.dirname(__file__), 'test_files/') # test file path - def test_PCFile_ae(self): - pc = PCFile(self.testfilepath + "NREL_5MW_pc.txt", self.testfilepath + "NREL_5MW_ae.txt") - self.assertEqual(pc.thickness(32), 23.78048780487805) - self.assertEqual(pc.chord(32), 3.673) - self.assertEqual(pc.pc_set_nr(32), 1) - - def test_PCFile2(self): - pc = PCFile(self.testfilepath + "NREL_5MW_pc.txt", self.testfilepath + "NREL_5MW_ae.txt") - self.assertEqual(pc.CL(36, 10), 1.358) - self.assertEqual(pc.CD(36, 10), 0.0255) - self.assertEqual(pc.CM(36, 10), -0.1103) - + pc = PCFile(self.testfilepath + "NREL_5MW_pc.txt") + ae = AEFile(self.testfilepath + "NREL_5MW_ae.txt") + thickness = ae.thickness(36) + self.assertEqual(pc.CL(thickness, 10), 1.358) + self.assertEqual(pc.CD(thickness, 10), 0.0255) + self.assertEqual(pc.CM(thickness, 10), -0.1103) if __name__ == "__main__": #import sys;sys.argv = ['', 'Test.testName']