diff --git a/wetb/hawc2/htc_file.py b/wetb/hawc2/htc_file.py index 50d834be0b11bcad06483bd63a22e4af9e95ce27..c4c353dc6657dc6f68b9505fd5c471c98203912a 100644 --- a/wetb/hawc2/htc_file.py +++ b/wetb/hawc2/htc_file.py @@ -7,241 +7,49 @@ See documentation of HTCFile below ''' from collections import OrderedDict -import os -import time -import numpy as np -from wetb.functions.process_exec import pexec - -class HTCSection(object): - section = [] - def __init__(self, section): - self.section = section - - def __str__(self): - return repr(self) - - def __repr__(self): - return self.section2str(self.section) - - def section2str(self, section, level=0): - #list(list(section.items())[5][1][0].items())[8] - s = "" - endcomment = "" - if isinstance(section, tuple): - section, endcomment = section - for k, vs in section.items(): - for v, comment in ([vs], vs)[isinstance(vs, list)]: - if isinstance(v, OrderedDict): - s += "%sbegin %s;\t%s\n" % (" "*level, k, comment[0]) - s += self.section2str(v, level + 1) - s += "%send %s;\t%s\n" % (" "*level, k, comment[1]) - elif isinstance(v, list): - #s += "%sbegin %s;%s\n" % (" "*level, k, comment[0]) - v = [_v.strip() for _v in v] - s += " "*(level) + ("\n%s" % (" "*(level))).join(v) + ("", "\n")[len(v) > 0] - #s += "%send %s;%s\n" % (" "*level, k, comment[1]) - elif v is None: - pass - else: - if k.startswith(";"): - s += ("%s;\t%s" % (v, comment)).rstrip() + "\n" - else: - s += ("%s%s\t%s;\t%s" % (" "*(level), k, v, comment)).rstrip() + "\n" - return s + endcomment - - - def __getattribute__(self, *args, **kwargs): - try: - return object.__getattribute__(self, *args, **kwargs) - except: - #if args[0] not in self.section: - # return "" - if isinstance(self.section[args[0]][0], OrderedDict): - return HTCSection(self.section[args[0]][0]) - return self.section[args[0]][0] - - def __setattr__(self, *args, **kwargs): - k, v = args - if k in dir(self): # in ['section', 'filename', 'lines']: - return object.__setattr__(self, *args, **kwargs) - if k not in self.section: - if isinstance(v, (tuple, list)) and len(v) == 2: - self.section[k] = v - else: - self.section[k] = (v, "") - else: - if isinstance(v, (tuple, list)) and len(v) == 2: - self.section[k] = (str(v_) for v_ in v) - else: - comment = self.section[k][1] - self.section[args[0]] = (str(args[1]), comment) - - def __delattr__(self, *args, **kwargs): - k, = args - if k in self.section: - del self.section[k] - - def __eq__(self, other): - return str(self) == other - - def __getitem__(self, section): - if "/" in section: - sections = section.split('/') - val = self.section[sections[0]][0] - for s in sections[1:]: - val = val[s][0] - return val - return self.section[section][0] - - def add_section(self, name): - if name not in self.section: - self.section[name] = (OrderedDict(), ("", "")) - return HTCSection(self.section[name][0]) - - - -class HTCFile(HTCSection): - """Htc file wrapper - - Examples - -------- - # load - >>> htcfile = HTCFile("test.htc") - - # access (3 methods) - >>> print (htcfile['simulation']['time_stop'][0]) - 100 - >>> print (htcfile['simulation/time_stop']) - 100 - >>> print (htcfile.simulation.time_stop) - 100 - - - # set values - >>> htcfile.simulation.time_stop = 200 - - # delete keys - >>> del htcfile.simulation.logfile - - # safe key deleting - >>> try: - >>> del htcfile.hydro.water_properties.water_kinematics_dll - >>> except KeyError: - >>> pass - - # save - >>> htcfile.save() # replace existing file - >>> htcfile.save('newfilename.htc') - - # simulate - >>> htcfile.simulate('<hawc2path>/hawc2mb.exe') - """ +from wetb.hawc2.htc_contents import HTCContents, HTCSection, HTCLine, \ + HTCDefaults +import os +class HTCFile(HTCContents, HTCDefaults): filename = None - lines = [] + level = 0 + + initial_comments = None def __init__(self, filename=None): + self.contents = OrderedDict() + self.initial_comments = [] + if filename is None: self.filename = 'empty.htc' - self.lines = empty_htc.split("\n") + self.lines = self.empty_htc.split("\n") else: self.filename = filename with open(filename) as fid: self.lines = fid.readlines() - self.section = self.parse_section() - - def set_name(self, name): - self.filename = "%s.htc" % name - self.simulation.logfile = "./log/%s.log" % name - self.output.filename = "./res/%s" % name - - - def parse_line(self): - global curr_line - line, *comments = self.lines[curr_line].split(";") - comments = ";".join(comments).rstrip() - while curr_line + 1 < len(self.lines) and self.lines[curr_line + 1].strip().startswith(";"): - curr_line += 1 - comments += "\n%s" % self.lines[curr_line].rstrip() - return line, comments - - def key_value(self, line): - if " " in line.strip() or "\t" in line.strip(): - d = 9999 - if " " in line.strip(): - d = line.strip().index(" ") - if "\t" in line.strip() and line.strip().index('\t') < d: - d = line.strip().index('\t') - key = line.strip()[:d] - value = line.strip()[d + 1:] - return key, value - else: - return None, None - - def parse_section(self, startline=0): - global curr_line - section = OrderedDict() - curr_line = startline - while curr_line < len(self.lines): - line, comments = self.parse_line() - if line.strip().lower().startswith("begin "): - key = line.strip()[6:] - if key == "output": - keys = ['filename', 'data_format', 'buffer', 'time'] - sensors = [] - output = OrderedDict() - for k in ['filename', 'data_format', 'buffer', 'time']: - output[k] = (None, "") - while not self.lines[curr_line + 1].lower().strip().startswith('end'): - curr_line += 1 - line, comment = self.parse_line() - k, v = self.key_value(line) - if k in keys: - output[k] = (v, comment) - else: - sensors.append("%s;%s" % (line, comment)) - curr_line += 1 - line, endcomments = self.parse_line() - output['sensors'] = (sensors, ("", "")) - section[key] = (output, (comments, endcomments)) + self.lines = [l.strip() for l in self.lines] + + lines = self.lines.copy() + while lines: + if lines[0].startswith(";"): + self.initial_comments.append(lines.pop(0).strip()) + elif lines[0].lower().startswith("begin"): + self._add_contents(HTCSection.from_lines(lines)) + else: + line = HTCLine.from_lines(lines) + self._add_contents(line) + if line.name_ == "exit": + break - else: - curr_line += 1 - value, end_comments = self.parse_section(curr_line) - while self.lines[curr_line + 1].strip().startswith(";"): - curr_line += 1 - end_comments += "\n%s" % self.lines[curr_line].strip() - if key in section: - if not isinstance(section[key], list): - section[key] = [section[key], (value, (comments, end_comments))] - else: - section[key].append((value, (comments, end_comments))) - else: - section[key] = (value, (comments, end_comments)) - elif line.lower().strip().startswith("end "): - return section, comments - elif line.lower().strip().startswith('exit'): - pass - elif " " in line.strip() or "\t" in line.strip(): - key, value = self.key_value(line) - if key in section: - if not isinstance(section[key], list): - section[key] = [section[key], (value, comments)] - else: - section[key].append((value, comments)) - else: - section[key] = (value, comments) - else: - section[';%d' % (curr_line + 1)] = (line, comments) - curr_line += 1 - return section + def __setitem__(self, key, value): + self.contents[key] = value def __str__(self): - return self.section2str(self.section) + "exit;" - + return "".join(self.initial_comments + [c.__str__(1) for c in self]) def save(self, filename=None): if filename is None: @@ -251,101 +59,89 @@ class HTCFile(HTCSection): with open(filename, 'w') as fid: fid.write(str(self)) - def simulate(self, hawc2_path): - self.save(os.path.join(os.path.dirname(self.filename), "auto.htc")) - errorcode, stdout, stderr, cmd = pexec([hawc2_path, "./htc/auto.htc"], os.path.realpath("..", os.path.dirname(self.filename))) + def set_name(self, name): + self.filename = "%s.htc" % name + self.simulation.logfile = "./log/%s.log" % name + self.output.filename = "./res/%s" % name - if 'logfile' in self['simulation']: - with open(os.path.join(os.path.realpath(os.path.dirname(self.filename)), "../", self['simulation']['logfile'])) as fid: - log = fid.read() + def input_files(self): + files = [self.filename] + for mb in [self.new_htc_structure[mb] for mb in self.new_htc_structure.keys() if mb.startswith('main_body')]: + if "timoschenko_input" in mb: + files.append(mb.timoschenko_input.filename[0]) + files.append(mb.get('external_bladedata_dll', [None, None, None])[2]) + if 'aero' in self: + files.append(self.aero.ae_filename[0]) + files.append(self.aero.pc_filename[0]) + files.append(self.aero.get('external_bladedata_dll', [None, None, None])[2]) + files.append(self.aero.get('output_profile_coef_filename', [None])[0]) + if 'dynstall_ateflap' in self.aero: + files.append(self.aero.dynstall_ateflap.get('flap', [None] * 3)[2]) + if 'bemwake_method' in self.aero: + files.append(self.aero.bemwake_method.get('a-ct-filename', [None] * 3)[0]) + for dll in [self.dll[dll] for dll in self.get('dll', {}).keys()]: + files.append(dll.filename[0]) + if 'wind' in self: + files.append(self.wind.get('user_defined_shear', [None])[0]) + files.append(self.wind.get('wind.user_defined_shear_turbulence', [None])[0]) + if 'wakes' in self: + files.append(self.wind.get('use_specific_deficit_file', [None])[0]) + files.append(self.wind.get('write_ct_cq_file', [None])[0]) + files.append(self.wind.get('write_final_deficits', [None])[0]) + if 'hydro' in self: + if 'water_properties' in self.hydro: + files.append(self.hydro.water_properties.get('water_kinematics_dll', [None])[0]) + if 'soil' in self: + if 'soil_element' in self.soil: + files.append(self.soil.soil_element.get('datafile', [None])[0]) + if 'force' in self: + files.append(self.force.get('dll', [None])[0]) + + return [f for f in set(files) if f] + + def output_files(self): + files = [] + for k, index in [('simulation/logfile', 0), + ('simulation/animation', 0), + ('simulation/visualization', 0), + ('new_htc_structure/beam_output_file_name', 0), + ('new_htc_structure/body_output_file_name', 0), + ('new_htc_structure/struct_inertia_output_file_name', 0), + ('new_htc_structure/body_eigenanalysis_file_name', 0), + ('new_htc_structure/constraint_output_file_name', 0), + ('new_htc_structure/structure_eigenanalysis_file_name', 0), + ('new_htc_structure/system_eigenanalysis', 0), + ('output_at_time/filename', 0), + ('turb_export/filename_u', 0), + ('turb_export/filename_v', 0), + ('turb_export/filename_w', 0)]: + line = self.get(k) + if line: + files.append(line[index]) + dataformat = self.output.get('data_format', 'hawc_ascii') + res_filename = self.output.filename[0] + if dataformat == "gtsdf" or dataformat == "gtsdf64": + files.append(res_filename + ".hdf5") + elif dataformat == "flex_int": + files.append(res_filename + ".int") + files.append(os.path.join(os.path.dirname(res_filename), 'sensor')) else: - log = stderr - if "error" in log.lower(): - raise Exception ("Simulation failed: %s" % (log[:log.lower().index("error") + 1000])) + files.append(res_filename + ".sel") + files.append(res_filename + ".dat") - def add_sensor(self, sensor, nr=None): - if nr is None: - nr = len(self.output.sensors) - line, *comments = sensor.split(";") - comments = ";".join(comments).rstrip() - self.output.sensors.insert(nr, ("%s;\t%s" % (line.strip(), comments)).rstrip()) + for key in [k for k in self.contents.keys() if k.startswith("output_at_time")]: + files.append(self[key]['filename'][0]) + return [f for f in files if f] + def turbulence_files(self): + files = [self.get('wind.%s.filename_%s' % (type, comp), [None])[0] for type in ['mann', 'flex'] for comp in ['u', 'v', 'w']] + return [f for f in files if f] - def add_mann_turbulence(self, L=29.4, ae23=1, Gamma=3.9, seed=1001, high_frq_compensation=True, - filenames=None, - no_grid_points=(4096, 32, 32), box_dimension=(6000, 100, 100), - std_scaling=(1, .8, .5)): - wind = self.add_section('wind') - wind.turb_format = (1, "0=none, 1=mann,2=flex") - mann = wind.add_section('mann') - mann.create_turb_parameters = ("%.2f %.3f %.2f %d %d" % (L, ae23, Gamma, seed, high_frq_compensation), "L, alfaeps, gamma, seed, highfrq compensation") - if filenames is None: - filenames = ["./turb/turb_wsp%d_s%04d%s.bin" % (float(self.wind.wsp), seed, c) for c in ['u', 'v', 'w']] - if isinstance(filenames, str): - filenames = ["./turb/%s_s%04d%s.bin" % (filenames, seed, c) for c in ['u', 'v', 'w']] - for filename, c in zip(filenames, ['u', 'v', 'w']): - setattr(mann, 'filename_%s' % c, filename) - for c, n, dim in zip(['u', 'v', 'w'], no_grid_points, box_dimension): - setattr(mann, 'box_dim_%s' % c, "%d %.4f" % (n, dim / (n - 1))) - if std_scaling is None: - mann.dont_scale = 1 - else: - try: - del mann.dont_scale - except KeyError: - pass - mann.std_scaling = "%f %f %f" % std_scaling -empty_htc = """begin simulation; - time_stop 600; - solvertype 1; (newmark) - on_no_convergence continue; - convergence_limits 1E3 1.0 1E-7; ; . to run again, changed 07/11 - begin newmark; - deltat 0.02; - end newmark; -end simulation; -; -;---------------------------------------------------------------------------------------------------------------------------------------------------------------- -; -begin new_htc_structure; - begin orientation; - end orientation; - begin constraint; - end constraint; -end new_htc_structure; -; -;---------------------------------------------------------------------------------------------------------------------------------------------------------------- -; -begin wind ; - density 1.225 ; - wsp 10 ; - tint 1; - horizontal_input 1 ; 0=false, 1=true - windfield_rotations 0 0.0 0.0 ; yaw, tilt, rotation - center_pos0 0 0 -30 ; hub heigth - shear_format 1 0;0=none,1=constant,2=log,3=power,4=linear - turb_format 0 ; 0=none, 1=mann,2=flex - tower_shadow_method 0 ; 0=none, 1=potential flow, 2=jet -end wind; -; -;---------------------------------------------------------------------------------------------------------------------------------------------------------------- -; -begin dll; -end dll; -; -;---------------------------------------------------------------------------------------------------------------------------------------------------------------- -; -begin output; - general time; -end output; -exit;""" if "__main__" == __name__: - f = HTCFile(r"C:\mmpe\hawc2\models\DTU10MWRef\htc\dtu_10mw_rwt.htc") - print (f.section2str(f['new_htc_structure']['main_body'][0])) - f.simulate("hawc2_path") - + f = HTCFile(r"C:\mmpe\HAWC2\Hawc2_model\htc\NREL_5MW_reference_wind_turbine_launcher_test.htc") + print ("\n".join(f.output_files())) diff --git a/wetb/hawc2/tests/test_files/test.htc b/wetb/hawc2/tests/test_files/test.htc deleted file mode 100644 index 8b493130355be4985435681b1831b1b8307bce36..0000000000000000000000000000000000000000 --- a/wetb/hawc2/tests/test_files/test.htc +++ /dev/null @@ -1,773 +0,0 @@ -; DTU_10MW_RWT, cpav, 17th Friday 2015 -; -begin simulation; - time_stop 100; - solvertype 1; (newmark) - on_no_convergence continue; - convergence_limits 1E3 1.0 1E-7; ; . to run again, changed 07/11 - logfile ./logfiles/dlc12_iec61400-1ed3/dlc12_wsp10_wdir000_s1004.log; -; visualization ./visualization/dlc12_wsp10_wdir000_s1004.hdf5; - begin newmark; - deltat 0.02; - end newmark; -end simulation; -; -;---------------------------------------------------------------------------------------------------------------------------------------------------------------- -begin new_htc_structure; -;-------------------------------------------------------------------------------------------------- -; beam_output_file_name ./res_eigen/dlc12_iec61400-1ed3/dlc12_wsp10_wdir000_s1004/dlc12_iec61400-1ed3/dlc12_wsp10_wdir000_s1004/dlc12_wsp10_wdir000_s1004_beam.dat; -; body_output_file_name ./res_eigen/dlc12_iec61400-1ed3/dlc12_wsp10_wdir000_s1004/dlc12_iec61400-1ed3/dlc12_wsp10_wdir000_s1004/dlc12_wsp10_wdir000_s1004_body.dat; -; struct_inertia_output_file_name ./res_eigen/dlc12_iec61400-1ed3/dlc12_wsp10_wdir000_s1004/dlc12_iec61400-1ed3/dlc12_wsp10_wdir000_s1004/dlc12_wsp10_wdir000_s1004_struct.dat; -; body_eigenanalysis_file_name ./res_eigen/dlc12_iec61400-1ed3/dlc12_wsp10_wdir000_s1004/dlc12_iec61400-1ed3/dlc12_wsp10_wdir000_s1004/dlc12_wsp10_wdir000_s1004_body_eigen.dat; -; structure_eigenanalysis_file_name ./res_eigen/dlc12_iec61400-1ed3/dlc12_wsp10_wdir000_s1004/dlc12_iec61400-1ed3/dlc12_wsp10_wdir000_s1004/dlc12_wsp10_wdir000_s1004_strc_eigen.dat; -;--------------------------------------------------------------------------------------------------- - begin main_body; tower 115m - name tower; - type timoschenko; - nbodies 1; - node_distribution c2_def; - damping_posdef 0.0 0.0 0.0 4.12E-03 4.12E-03 4.5E-04; Mx My Mz Kx Ky Kz , M´s raises overall level, K´s raises high freguency level "tuned by Larh" - begin timoschenko_input; - filename ./data/DTU_10MW_RWT_Tower_st.dat; - set 1 2; - end timoschenko_input; - begin c2_def; Definition of centerline (main_body coordinates) - nsec 11; - sec 1 0 0 0.00 0; x,y,z,twist - sec 2 0 0 -11.50 0; - sec 3 0 0 -23.00 0; - sec 4 0 0 -34.50 0; - sec 5 0 0 -46.00 0; - sec 6 0 0 -57.50 0; - sec 7 0 0 -69.00 0; - sec 8 0 0 -80.50 0; - sec 9 0 0 -92.00 0; - sec 10 0 0 -103.50 0; - sec 11 0 0 -115.63 0; - end c2_def; - end main_body; -; - begin main_body; - name towertop; - type timoschenko; - nbodies 1; - node_distribution c2_def; - damping_posdef 0.0 0.0 0.0 7.00E-03 7.00E-03 7.00E-03; "changed by Larh" - concentrated_mass 2.0 0.0 2.6870E+00 3.0061E-01 4.4604E+05 4.1060E+06 4.1060E+05 4.1060E+06; Nacelle mass and inertia "corrected by Anyd 25/4/13" - begin timoschenko_input; - filename ./data/DTU_10MW_RWT_Towertop_st.dat; - set 1 2; - end timoschenko_input; - begin c2_def; Definition of centerline (main_body coordinates) - nsec 2; - sec 1 0.0 0.0 0.0 0.0; x,y,z,twist - sec 2 0.0 0.0 -2.75 0.0; - end c2_def; - end main_body; -; - begin main_body; - name shaft; - type timoschenko; - nbodies 1; - node_distribution c2_def; - damping_posdef 0.0 0.0 0.0 4.65E-04 4.65E-04 3.983E-03; "tuned by Anyd 23/5/13 to 31.45 log decr. damping for free free with stiff rotor and tower" - concentrated_mass 1.0 0.0 0.0 0.0 0.0 0.0 0.0 3.751E+06; generator equivalent slow shaft "re_tuned by Anyd 20/2/13" - concentrated_mass 5.0 0.0 0.0 0.0 1.0552E+05 0.0 0.0 3.257E+05; hub mass and inertia; "re_tuned by Anyd 20/2/13" - begin timoschenko_input; - filename ./data/DTU_10MW_RWT_Shaft_st.dat; - set 1 1; - end timoschenko_input; - begin c2_def; Definition of centerline (main_body coordinates) - nsec 5; - sec 1 0.0 0.0 0.0 0.0; Tower top x,y,z,twist - sec 2 0.0 0.0 -1.5 0.0; - sec 3 0.0 0.0 -3.0 0.0; - sec 4 0.0 0.0 -4.4 0.0; Main bearing - sec 5 0.0 0.0 -7.1 0.0; Rotor centre - end c2_def; - end main_body; -; - begin main_body; - name hub1; - type timoschenko; - nbodies 1; - node_distribution c2_def; - damping_posdef 0.0 0.0 0.0 3.00E-06 3.00E-06 2.00E-05; "changed by Larh" - begin timoschenko_input; - filename ./data/DTU_10MW_RWT_Hub_st.dat; - set 1 2; - end timoschenko_input; - begin c2_def; Definition of centerline (main_body coordinates) - nsec 2; - sec 1 0.0 0.0 0.0 0.0; x,y,z,twist - sec 2 0.0 0.0 2.8 0.0; - end c2_def; - end main_body; -; -begin main_body; - name hub2; - copy_main_body hub1; -end main_body; -; -begin main_body; - name blade1; - type timoschenko; - nbodies 10; - node_distribution c2_def; - damping_posdef 0.0 0.0 0.0 0.00153 0.00255 0.00033; - begin timoschenko_input; - filename data/2Bdown-rR1.08_blade_st.dat; - set 1 1; - end timoschenko_input; - begin c2_def; - nsec 20; - sec 1 -6.48506643395348917053e-16 5.04432273032044074237e-05 2.39808173319033927116e-16 -1.02444066874147825530e+01; - sec 2 -1.77803489746453341307e-03 1.40884010924257948444e-02 4.94005896339658523431e+00 -1.03091808614494873098e+01; - sec 3 -1.29212241029686869531e-01 5.79344574853726257402e-02 1.04152655253544850211e+01 -1.03512581325657002651e+01; - sec 4 -6.50220227984423693179e-01 1.59254321735797399473e-01 1.63759726688984237342e+01 -8.39274960342848785899e+00; - sec 5 -1.10016152136135403339e+00 2.09976513503588618770e-01 2.27401393284814510309e+01 -5.29939281517982863079e+00; - sec 6 -1.27609842156438824112e+00 2.52497605662293733708e-01 2.93954065626978966463e+01 -3.67457815074469085204e+00; - sec 7 -1.26200198053285372879e+00 3.08809307184219228315e-01 3.62056325665537315217e+01 -2.38384593727400062591e+00; - sec 8 -1.12902484623288623666e+00 3.89613109385942235630e-01 4.30213648789366942538e+01 -1.07640254791781408983e+00; - sec 9 -9.75642487443318273677e-01 5.00517978918732286964e-01 4.96926697536713462000e+01 3.99910621631581308932e-01; - sec 10 -8.30703689432845115981e-01 6.43627562673231068402e-01 5.60820487321786202983e+01 1.90120197901677179253e+00; - sec 11 -7.03732321571815977457e-01 8.14873082490295441715e-01 6.20751462106500326854e+01 3.28366369604164543006e+00; - sec 12 -5.97896788566067871606e-01 1.00643157409663430712e+00 6.75876008339258476099e+01 4.46194140922395110493e+00; - sec 13 -5.12851158579595400866e-01 1.20836579160246815334e+00 7.25674388984144798087e+01 5.41647291969291710956e+00; - sec 14 -4.46215476488487916562e-01 1.41156599583795405728e+00 7.69934419594975452128e+01 6.17190016755864956366e+00; - sec 15 -3.94337497995550290142e-01 1.60817569136336380176e+00 8.08706180936091385547e+01 6.77035476874162256422e+00; - sec 16 -3.51792123394631617295e-01 1.79298858887296819198e+00 8.42241469170983663162e+01 7.23511092753480955508e+00; - sec 17 -3.07790697631454057692e-01 1.96360524492743881986e+00 8.70930265569473078813e+01 7.57092772105627531687e+00; - sec 18 -2.56218346285707054832e-01 2.11879327890513113886e+00 8.95242977444024887745e+01 7.76961278403044897090e+00; - sec 19 -1.94041837542441558684e-01 2.25830640717902486614e+00 9.15683243220642566484e+01 7.83441475282797217261e+00; - sec 20 -1.24300073691619730742e-01 2.38167115113771243884e+00 9.32752800000000092950e+01 7.79502842679776009049e+00; - end c2_def; -end main_body; -begin main_body; - name blade2; - copy_main_body blade1; -end main_body; -;------------------------------------------------------------------------------------------------------------------------------- -; - begin orientation; - begin base; - body tower; - inipos 0.0 0.0 0.0; initial position of node 1 - body_eulerang 0.0 0.0 0.0; - end base; -; - begin relative; - body1 tower last; - body2 towertop 1; - body2_eulerang 0.0 0.0 0.0; - end relative; -; - begin relative; - body1 towertop last; - body2 shaft 1; - body2_eulerang 90.0 0.0 0.0; - body2_eulerang -5.0 0.0 0.0; 5 deg tilt angle - body2_eulerang 0.0 0.0 0; - mbdy2_ini_rotvec_d1 0.0 0.0 -1.0 0.5; mbdy2_ini_rotvec_d1 0.0 0.0 -1.0 0.5; - end relative; -; -begin relative; - body1 shaft last; - body2 hub1 1; - body2_eulerang -90.000000 0.000000 0.000000; -;body2_eulerang 0.000000 0.000000 0.000000; -; body2_eulerang 2.500000 0.000000 0.000000; - end relative; - begin relative; - body1 shaft last; - body2 hub2 1; - body2_eulerang -90.000000 0.000000 0.000000; - body2_eulerang 0.000000 180.000000 0.000000; -; body2_eulerang 2.500000 0.000000 0.000000; - end relative; - begin relative; - body1 hub1 last; - body2 blade1 1; - body2_eulerang 0.000000 0.000000 0.000000; - end relative; - begin relative; - body1 hub2 last; - body2 blade2 1; - body2_eulerang 0.000000 0.000000 0.000000; - end relative; -end orientation; -;------------------------------------------------------------------------------------------------------------------------------- -begin constraint; -; - begin fix0; fixed to ground in translation and rotation of node 1 - body tower; - end fix0; -; - begin fix1; tower towertop - body1 tower last; - body2 towertop 1; - end fix1; -begin fix1; shaft hub - body1 shaft last; - body2 hub1 1; - end fix1; - begin fix1; - body1 shaft last; - body2 hub2 1; - end fix1; - ; - begin bearing1; free bearing - name shaft_rot; - body1 towertop last; - body2 shaft 1; - bearing_vector 2 0.0 0.0 -1.0; x=coo (0=global.1=body1.2=body2) vector in body2 coordinates where the free rotation is present - end bearing1; -; -; begin bearing3; free bearing -; name shaft_rot; -; body1 towertop last; -; body2 shaft 1; -; bearing_vector 2 0.0 0.0 -1.0; x=coo (0=global.1=body1.2=body2) vector in body2 coordinates where the free rotation is present -; omegas 0.0; -; end bearing3; -; - begin bearing2; - name pitch1; - body1 hub1 last; - body2 blade1 1; - bearing_vector 2 0.000 0.000 -1.000; - end bearing2; - begin bearing2; - name pitch2; - body1 hub2 last; - body2 blade2 1; - bearing_vector 2 0.000 0.000 -1.000; - end bearing2; -end constraint; -end new_htc_structure; -;---------------------------------------------------------------------------------------------------------------------------------------------------------------- -begin wind; - density 1.225; - wsp 10; - tint 0.2096; - horizontal_input 1; - windfield_rotations 0 0.0 0.0; yaw, tilt, rotation - center_pos0 0.0 0.0 -119; hub heigth - shear_format 3 0.2; - turb_format 1; 0=none, 1=mann,2=flex - tower_shadow_method 3; 0=none, 1=potential flow, 2=jet - scale_time_start 0; - wind_ramp_factor 0.0 100 0.8 1.0; -; iec_gust; -; -; wind_ramp_abs 400.0 401.0 0.0 1.0; wsp. after the step: 5.0 -; wind_ramp_abs 501.0 502.0 0.0 1.0; wsp. after the step: 6.0 -; wind_ramp_abs 602.0 603.0 0.0 1.0; wsp. after the step: 7.0 -; wind_ramp_abs 703.0 704.0 0.0 1.0; wsp. after the step: 8.0 -; wind_ramp_abs 804.0 805.0 0.0 1.0; wsp. after the step: 9.0 -; wind_ramp_abs 905.0 906.0 0.0 1.0; wsp. after the step: 10.0 -; wind_ramp_abs 1006.0 1007.0 0.0 1.0; wsp. after the step: 11.0 -; wind_ramp_abs 1107.0 1108.0 0.0 1.0; wsp. after the step: 12.0 -; wind_ramp_abs 1208.0 1209.0 0.0 1.0; wsp. after the step: 13.0 -; wind_ramp_abs 1309.0 1310.0 0.0 1.0; wsp. after the step: 14.0 -; wind_ramp_abs 1410.0 1411.0 0.0 1.0; wsp. after the step: 15.0 -; wind_ramp_abs 1511.0 1512.0 0.0 1.0; wsp. after the step: 16.0 -; wind_ramp_abs 1612.0 1613.0 0.0 1.0; wsp. after the step: 17.0 -; wind_ramp_abs 1713.0 1714.0 0.0 1.0; wsp. after the step: 18.0 -; wind_ramp_abs 1814.0 1815.0 0.0 1.0; wsp. after the step: 19.0 -; wind_ramp_abs 1915.0 1916.0 0.0 1.0; wsp. after the step: 20.0 -; wind_ramp_abs 2016.0 2017.0 0.0 1.0; wsp. after the step: 21.0 -; wind_ramp_abs 2117.0 2118.0 0.0 1.0; wsp. after the step: 22.0 -; wind_ramp_abs 2218.0 2219.0 0.0 1.0; wsp. after the step: 23.0 -; wind_ramp_abs 2319.0 2320.0 0.0 1.0; wsp. after the step: 24.0 -; wind_ramp_abs 2420.0 2421.0 0.0 1.0; wsp. after the step: 25.0 -; - begin mann; - create_turb_parameters 29.4 1.0 3.9 1004 1.0; L, alfaeps, gamma, seed, highfrq compensation - filename_u ./turb/turb_wsp10_s1004u.bin; - filename_v ./turb/turb_wsp10_s1004v.bin; - filename_w ./turb/turb_wsp10_s1004w.bin; - box_dim_u 1024 0.8544921875; - box_dim_v 32 6.5; - box_dim_w 32 6.5; - std_scaling 1.0 0.7 0.5; - end mann; -; - begin tower_shadow_potential_2; - tower_mbdy_link tower; - nsec 2; - radius 0.0 4.15; - radius 115.63 2.75; (radius) - end tower_shadow_potential_2; -end wind; -; -begin aerodrag; - begin aerodrag_element; - mbdy_name tower; - aerodrag_sections uniform 10; - nsec 2; - sec 0.0 0.6 8.3; tower bottom - sec 115.63 0.6 5.5; tower top (diameter) - end aerodrag_element; -; - begin aerodrag_element; Nacelle drag side - mbdy_name shaft; - aerodrag_sections uniform 2; - nsec 2; - sec 0.0 0.8 10.0; - sec 7.01 0.8 10.0; - end aerodrag_element; -end aerodrag; -; -begin aero; - nblades 2; - hub_vec shaft -3; rotor rotation vector (normally shaft composant directed from pressure to sustion side) - link 1 mbdy_c2_def blade1; - link 2 mbdy_c2_def blade2; -; link 3 mbdy_c2_def blade3; - ae_filename ./data/2Bdown-rR1.08_ae.dat; - pc_filename ./data/2Bup_AEP095_pc.dat; - induction_method 1; 0=none, 1=normal - aerocalc_method 1; 0=ingen aerodynamic, 1=med aerodynamic - aerosections 50; def. 50 - ae_sets 1 1 1; - tiploss_method 1; 0=none, 1=prandtl - dynstall_method 2; 0=none, 1=stig øye method,2=mhh method -; -end aero; -;------------------------------------------------------------------------------------------------- -begin dll; -; - begin type2_dll; - name risoe_controller; - filename ./control/risoe_controller.dll; - dll_subroutine_init init_regulation; - dll_subroutine_update update_regulation; - arraysizes_init 52 1; - arraysizes_update 12 100; - begin init; -; Overall parameters - constant 1 10000.0; Rated power [kW] - constant 2 0.628; Minimum rotor speed [rad/s] - constant 3 1.005; Rated rotor speed [rad/s] - constant 4 15.6E+06; Maximum allowable generator torque [Nm] - constant 5 110.0; Minimum pitch angle, theta_min [deg], - ; if |theta_min|>90, then a table of <wsp,theta_min> is read; - ; from a file named 'wptable.n', where n=int(theta_min) - constant 6 82.0; Maximum pitch angle [deg] - constant 7 10.0; Maximum pitch velocity operation [deg/s] - constant 8 0.4; Frequency of generator speed filter [Hz] - constant 9 0.7; Damping ratio of speed filter [-] - constant 10 2.42; Frequency of free-free DT torsion mode [Hz], if zero no notch filter used -; Partial load control parameters - constant 11 0.108212E+08; Optimal Cp tracking K factor [Nm/(rad/s)^2],; - ; Qg=K*Omega^2, K=eta*0.5*rho*A*Cp_opt*R^3/lambda_opt^3 - constant 12 3.237E+07; Proportional gain of torque controller [Nm/(rad/s)] - constant 13 7.263E+06; Integral gain of torque controller [Nm/rad] - constant 14 0.0; Differential gain of torque controller [Nm/(rad/s^2)] -; Full load control parameters - constant 15 2; Generator control switch [1=constant power, 2=constant torque] - constant 16 5.525E-01; Proportional gain of pitch controller [rad/(rad/s)] - constant 17 1.817E-01; Integral gain of pitch controller [rad/rad] - constant 18 0.0; Differential gain of pitch controller [rad/(rad/s^2)] - constant 19 0.4e-8; Proportional power error gain [rad/W] - constant 20 0.4e-8; Integral power error gain [rad/(Ws)] - constant 21 1.113E+01; Coefficient of linear term in aerodynamic gain scheduling, KK1 [deg] - constant 22 4.791E+02; Coefficient of quadratic term in aerodynamic gain scheduling, KK2 [deg^2] & - ; (if zero, KK1 = pitch angle at double gain) - constant 23 1.3; Relative speed for double nonlinear gain [-] -; Cut-in simulation parameters - constant 24 -1; Cut-in time [s] - constant 25 1.0; Time delay for soft start of torque [1/1P] -; Cut-out simulation parameters - constant 26 -1; Cut-out time [s] - constant 27 5.0; Time constant for linear torque cut-out [s] - constant 28 1; Stop type [1=normal, 2=emergency] - constant 29 1.0; Time delay for pitch stop after shut-down signal [s] - constant 30 3; Maximum pitch velocity during initial period of stop [deg/s] - constant 31 3.0; Time period of initial pitch stop phase [s] (maintains pitch speed specified in constant 30) - constant 32 4; Maximum pitch velocity during final phase of stop [deg/s] -; Expert parameters (keep default values unless otherwise given) - constant 33 2.0; Lower angle above lowest minimum pitch angle for switch [deg] - constant 34 2.0; Upper angle above lowest minimum pitch angle for switch [deg], if equal then hard switch - constant 35 95.0; Ratio between filtered speed and reference speed for fully open torque limits [%] - constant 36 2.0; Time constant of 1st order filter on wind speed used for minimum pitch [1/1P] - constant 37 1.0; Time constant of 1st order filter on pitch angle used for gain scheduling [1/1P] -; Drivetrain damper - constant 38 0.0; Proportional gain of active DT damper [Nm/(rad/s)], requires frequency in input 10 -; Over speed - constant 39 250.0; Overspeed percentage before initiating turbine controller alarm (shut-down) [%] -; Additional non-linear pitch control term (not used when all zero) - constant 40 0.0; Err0 [rad/s] - constant 41 0.0; ErrDot0 [rad/s^2] - constant 42 0.0; PitNonLin1 [rad/s] -; Storm control command - constant 43 28.0; Wind speed 'Vstorm' above which derating of rotor speed is used [m/s] - constant 44 28.0; Cut-out wind speed (only used for derating of rotor speed in storm) [m/s] -; Safety system parameters - constant 45 300.0; Overspeed percentage before initiating safety system alarm (shut-down) [%] - constant 46 1.5; Max low-pass filtered tower top acceleration level [m/s^2] - max in DLC 1.3=1.1 m/s^2 -; Turbine parameter - constant 47 192.19808; Nominal rotor diameter [m] -; Parameters for rotor inertia reduction in variable speed region - constant 48 0.0; Proportional gain on rotor acceleration in variable speed region [Nm/(rad/s^2)] (not used when zero) -; Parameters for alternative partial load controller with PI regulated TSR tracking - constant 49 0.0; Optimal tip speed ratio [-] (only used when K=constant 11 = 0 otherwise Qg=K*Omega^2 is used) -; Parameters for adding aerodynamic drivetrain damping on gain scheduling - constant 50 0.0; Proportional gain of aerodynamic DT damping [Nm/(rad/s)] - constant 51 0.0; Coefficient of linear term in aerodynamic DT damping scheduling, KK1 [deg] - constant 52 0.0; Coefficient of quadratic term in aerodynamic DT damping scheduling, KK2 [deg^2] - end init; -; - begin output; - general time; [s] - constraint bearing1 shaft_rot 1 only 2; Drivetrain speed [rad/s] - constraint bearing2 pitch1 1 only 1; [rad] - constraint bearing2 pitch2 1 only 1; [rad] - constraint bearing2 pitch2 1 only 1; [rad] ! Changed from pitch 3 - Keep the line for the output order - wind free_wind 1 0.0 0.0 -119; Global coordinates at hub height - dll inpvec 2 2; Elec. power from generator servo .dll - dll inpvec 2 8; Grid state flag from generator servo .dll - mbdy state acc tower 10 1.0 global only 1; Tower top x-acceleration [m/s^2] - mbdy state acc tower 10 1.0 global only 2; Tower top y-acceleration [m/s^2] - end output; - end type2_dll; -; - begin type2_dll; - name generator_servo; - filename ./control/generator_servo.dll; - dll_subroutine_init init_generator_servo; - dll_subroutine_update update_generator_servo; - arraysizes_init 7 1; - arraysizes_update 4 8; - begin init; - constant 1 20.0; Frequency of 2nd order servo model of generator-converter system [Hz] - constant 2 0.9; Damping ratio 2nd order servo model of generator-converter system [-] - constant 3 15.6E+06; Maximum allowable LSS torque (pull-out torque) [Nm] - constant 4 0.94; Generator efficiency [-] - constant 5 1.0; Gearratio [-] - constant 6 0.0; Time for half value in softstart of torque [s] - constant 7 1000; Time for grid loss [s] - end init; -; - begin output; - general time; Time [s] - dll inpvec 1 1; Electrical torque reference [Nm] - constraint bearing1 shaft_rot 1 only 2; Generator LSS speed [rad/s] - mbdy momentvec shaft 1 1 shaft only 3; Shaft moment [kNm] (Qshaft) - end output; -; - begin actions; - mbdy moment_int shaft 1 -3 shaft towertop 2; Generator LSS torque [Nm] - end actions; - end type2_dll; -; - begin type2_dll; - name mech_brake; - filename ./control/mech_brake.dll; - dll_subroutine_init init_mech_brake; - dll_subroutine_update update_mech_brake; - arraysizes_init 7 1; - arraysizes_update 4 6; - begin init; - constant 1 2727252.0; Fully deployed maximum brake torque [Nm] - constant 2 100.0; Parameter alpha used in Q = tanh(omega*alpha), typically 1e2/Omega_nom - constant 3 0.625; Delay time for before brake starts to deploy [s] - from 5MW*1P_5/1P_10 - constant 4 0.75; Time for brake to become fully deployed [s] - end init; -; - begin output; - general time; Time [s] - constraint bearing1 shaft_rot 1 only 2; Generator LSS speed [rad/s] - dll inpvec 1 25; Command to deploy mechanical disc brake [0,1] - end output; -; - begin actions; - mbdy moment_int shaft 1 3 shaft towertop 2; Generator LSS torque [Nm] - end actions; - end type2_dll; -; - begin type2_dll; - name servo_with_limits; - filename ./control/servo_with_limits.dll; - dll_subroutine_init init_servo_with_limits; - dll_subroutine_update update_servo_with_limits; - arraysizes_init 10 1; - arraysizes_update 5 9; - begin init; - constant 1 3; Number of blades [-] - constant 2 1.0; Frequency of 2nd order servo model of pitch system [Hz] - constant 3 0.7; Damping ratio 2nd order servo model of pitch system [-] - constant 4 10.0; Max. pitch speed [deg/s] - constant 5 15.0; Max. pitch acceleration [deg/s^2] - constant 6 -5.0; Min. pitch angle [deg] - constant 7 90.0; Max. pitch angle [deg] - constant 8 1000; Time for pitch runaway [s] - constant 9 -1; Time for stuck blade 1 [s] - constant 10 0; Angle of stuck blade 1 [deg] - end init; - begin output; - general time; Time [s] - dll inpvec 1 2; Pitch1 demand angle [rad] - dll inpvec 1 3; Pitch2 demand angle [rad] - dll inpvec 1 4; Pitch3 demand angle [rad] - dll inpvec 1 26; Flag for emergency pitch stop [0=off/1=on] - end output; -; - begin actions; - constraint bearing2 angle pitch1; Angle pitch1 bearing [rad] - constraint bearing2 angle pitch2; Angle pitch2 bearing [rad] - general ignore 1; - end actions; - end type2_dll; -; -; --- DLL for tower-blade tip distance --; - begin type2_dll; - name disttowtip; - filename ./control/towclearsens.dll; - dll_subroutine_init initialize; - dll_subroutine_update update; - arraysizes_init 1 1; - arraysizes_update 12 4; - begin init; - constant 1 3.79; Tower radius close to downward blade tip [m] - end init; - begin output; - mbdy state pos tower 3 0.62 global; [1,2,3]. Tower position: 30.18 m - mbdy state pos blade1 19 1.0 global; [4,5,6] - mbdy state pos blade2 19 1.0 global; [7,8,9] - mbdy state pos blade2 19 1.0 global; [10,11,12] - end output; - end type2_dll; -end dll; -; -;---------------------------------------------------------------------------------------------------------------------------------------------------------------- -; -begin output; - filename ./res/dlc12_iec61400-1ed3/dlc12_wsp10_wdir000_s1004; -;time 100 700; - data_format hawc_binary; - buffer 1; -; - general time; - general constant 1.0; constant 1.0 - to mesure activity of flap in terms of displacement - constraint bearing1 shaft_rot 2; angle and angle velocity - constraint bearing2 pitch1 5; angle and angle velocity - constraint bearing2 pitch2 5; angle and angle velocity -; constraint bearing2 pitch3 5; angle and angle velocity - aero omega; - aero torque; - aero power; - aero thrust; - wind free_wind 1 0.0 0.0 -119; local wind at fixed position: coo (1=global,2=non-rotation rotor coo.), pos x, pos y, pos z -; Moments: - mbdy momentvec tower 1 1 tower # tower base; - mbdy momentvec tower 10 2 tower # tower yaw bearing; - mbdy momentvec shaft 4 1 shaft # main bearing; -; Displacements and accellerations - mbdy state pos tower 10 1.0 global only 1 # Tower top FA displ; - mbdy state pos tower 10 1.0 global only 2 # Tower top SS displ; - mbdy state acc tower 10 1.0 global only 1 # Tower top FA acc; - mbdy state acc tower 10 1.0 global only 2 # Tower top SS acc; -; - mbdy state pos blade1 19 1.0 global # gl blade 1 tip pos; - mbdy state pos blade2 19 1.0 global # gl blade 2 tip pos; -; mbdy state pos blade3 26 1.0 global # gl blade 3 tip pos; - mbdy state pos blade1 19 1.0 blade1 # blade 1 tip pos; -; - mbdy state pos tower 3 0.62 global; [1,2,3]. Tower position: 30.18 m -; - Monitor Aerodynamics -; - aero windspeed 3 1 1 72.5; - aero alfa 1 72.5; - aero alfa 2 72.5; - aero alfa 3 72.5; - aero cl 1 72.5; - aero cl 2 72.5; - aero cl 3 72.5; - aero cd 1 72.5; - aero cd 2 72.5; - aero cd 3 72.5; -; - Main Controller - -; Output to controller -; dll outvec 1 1 # time; -; dll outvec 1 2 # slow speed shaft rad/s; -; dll outvec 1 3 # pitch angle 1; -; dll outvec 1 4 # pitch angle 2; -; dll outvec 1 5 # pitch angle 3; -; dll outvec 1 6 # WSP_x_global; -; dll outvec 1 7 # WSP_y_global; -; dll outvec 1 8 # WSP_z_global; -; dll outvec 1 9 # Elec. pwr; -; dll outvec 1 10 # Grid flag; -; Input from controller - dll inpvec 1 1 # Generator torque reference [Nm]; - dll inpvec 1 2 # Pitch angle reference of blade 1 [rad]; - dll inpvec 1 3 # Pitch angle reference of blade 2 [rad]; -; dll inpvec 1 4 # Pitch angle reference of blade 3 [rad]; -; dll inpvec 1 5 # Power reference [W]; -; dll inpvec 1 6 # Filtered wind speed [m/s]; -; dll inpvec 1 7 # Filtered rotor speed [rad/s]; -; dll inpvec 1 8 # Filtered rotor speed error for torque [rad/s]; -; dll inpvec 1 9 # Bandpass filtered rotor speed [rad/s]; -; dll inpvec 1 10 # Proportional term of torque contr. [Nm]; -; dll inpvec 1 11 # Integral term of torque controller [Nm]; -; dll inpvec 1 12 # Minimum limit of torque [Nm]; -; dll inpvec 1 13 # Maximum limit of torque [Nm]; - dll inpvec 1 14 # Torque limit switch based on pitch [-]; -; dll inpvec 1 15 # Filtered rotor speed error for pitch [rad/s]; -; dll inpvec 1 16 # Power error for pitch [W]; -; dll inpvec 1 17 # Proportional term of pitch controller [rad]; -; dll inpvec 1 18 # Integral term of pitch controller [rad]; -; dll inpvec 1 19 # Minimum limit of pitch [rad]; -; dll inpvec 1 20 # Maximum limit of pitch [rad]; - dll inpvec 1 21 # Torque reference from DT dammper [Nm]; - dll inpvec 1 22 # Status signal [-]; -; dll inpvec 1 23 # Total added pitch rate [rad/s]; - dll inpvec 1 24 # Filtered Mean pitch for gain sch [rad]; - dll inpvec 1 25 # Flag for mechnical brake [0=off/1=on]; - dll inpvec 1 26 # Flag for emergency pitch stop [0=off/1=on]; - dll inpvec 1 27 # LP filtered acceleration level [m/s^2]; -;; Output to generator model -; dll outvec 2 1 # time; -; dll outvec 2 2 # Electrical torque reference [Nm]; -; dll outvec 2 3 # omega LSS; -; Input from generator model - dll inpvec 2 1 # Mgen LSS [Nm]; - dll inpvec 2 2 # Pelec W; - dll inpvec 2 3 # Mframe; - dll inpvec 2 4 # Mgen HSS; - dll inpvec 2 5 # Generator Pmech kW; - dll inpvec 2 6 # Filtered Gen speed; - dll inpvec 2 7 # Resulting Eff; - dll inpvec 2 8 # Grid flag; -; Output to mechanical brake - dll inpvec 3 1 # Brake torque [Nm]; -;; Input from mechanical brake -; dll outvec 3 1 # Time [s]; -; dll outvec 3 2 # Generator LSS speed [rad/s]; -; dll outvec 3 3 # Deploy brake; -;; Output to pitch servo -; dll outvec 4 1 # time; -; dll outvec 4 2 # pitchref 1; -; dll outvec 4 3 # pitchref 2; -; dll outvec 4 4 # pitchref 3; -; dll outvec 4 5 # Emerg. stop; -; Input from pitch servo - dll inpvec 4 1 # pitch 1; - dll inpvec 4 2 # pitch 2; -; dll inpvec 4 3 # pitch 3; -; Check tower clearence - dll inpvec 5 1 # Bltip tow min d [m]; -; - Check on flap control: -;; - From flap controller: - -; dll type2_dll cyclic_flap_controller inpvec 1 # Ref flap signal bl 1 [deg]; -; dll type2_dll cyclic_flap_controller inpvec 2 # Ref flap signal bl 2 [deg]; -; dll type2_dll cyclic_flap_controller inpvec 3 # Ref flap signal bl 3 [deg]; -;; - Mbc values -; dll type2_dll cyclic_flap_controller inpvec 4 # momvec mbc cos [kNm]; -; dll type2_dll cyclic_flap_controller inpvec 5 # momvec mbc sin [kNm]; -; dll type2_dll cyclic_flap_controller inpvec 6 # momvec mbc filt cos [kNm]; -; dll type2_dll cyclic_flap_controller inpvec 7 # momvec mbc filt sin [kNm]; -; dll type2_dll cyclic_flap_controller inpvec 8 # flap mbc cos [deg]; -; dll type2_dll cyclic_flap_controller inpvec 9 # flap mbc sin [deg]; -;; - Check Gains -; -; dll type2_dll cyclic_flap_controller inpvec 10 # lead angle [deg]; -; dll type2_dll cyclic_flap_controller inpvec 11 # scaling on rat pow [-]; -; dll type2_dll cyclic_flap_controller inpvec 12 # actual kp [deg/kNm]; -; dll type2_dll cyclic_flap_controller inpvec 13 # actual ki [deg/kNms]; -; dll type2_dll cyclic_flap_controller inpvec 14 # actual kd [deg s/kNm]; -;; - Actual deflections - -; aero beta 1 1; -; aero beta 2 1; -; aero beta 3 1; -;; - Mbc values -; dll type2_dll cyclic_flap_controller inpvec 4 # momvec mbc cos [kNm]; -; dll type2_dll cyclic_flap_controller inpvec 5 # momvec mbc sin [kNm]; -; dll type2_dll cyclic_flap_controller inpvec 6 # momvec mbc filt cos [kNm]; -; dll type2_dll cyclic_flap_controller inpvec 7 # momvec mbc filt sin [kNm]; -; dll type2_dll cyclic_flap_controller inpvec 8 # flap mbc cos [deg]; -; dll type2_dll cyclic_flap_controller inpvec 9 # flap mbc sin [deg]; -; sectional blade loads -mbdy forcevec blade1 1 1 local # blade 1 local e coo; -mbdy forcevec blade1 2 1 local # blade 1 local e coo; -mbdy forcevec blade1 3 1 local # blade 1 local e coo; -mbdy forcevec blade1 4 1 local # blade 1 local e coo; -mbdy forcevec blade1 5 1 local # blade 1 local e coo; -mbdy forcevec blade1 6 1 local # blade 1 local e coo; -mbdy forcevec blade1 7 1 local # blade 1 local e coo; -mbdy forcevec blade1 8 1 local # blade 1 local e coo; -mbdy forcevec blade1 9 1 local # blade 1 local e coo; -mbdy forcevec blade1 10 1 local # blade 1 local e coo; -mbdy forcevec blade1 11 1 local # blade 1 local e coo; -mbdy forcevec blade1 12 1 local # blade 1 local e coo; -mbdy forcevec blade1 13 1 local # blade 1 local e coo; -mbdy forcevec blade1 14 1 local # blade 1 local e coo; -mbdy forcevec blade1 15 1 local # blade 1 local e coo; -mbdy forcevec blade1 16 1 local # blade 1 local e coo; -mbdy forcevec blade1 17 1 local # blade 1 local e coo; -mbdy forcevec blade1 18 1 local # blade 1 local e coo; -mbdy forcevec blade1 19 1 local # blade 1 local e coo; -mbdy forcevec blade1 19 2 local # blade 1 local e coo; -mbdy momentvec blade1 1 1 local # blade 1 local e coo; -mbdy momentvec blade1 2 1 local # blade 1 local e coo; -mbdy momentvec blade1 3 1 local # blade 1 local e coo; -mbdy momentvec blade1 4 1 local # blade 1 local e coo; -mbdy momentvec blade1 5 1 local # blade 1 local e coo; -mbdy momentvec blade1 6 1 local # blade 1 local e coo; -mbdy momentvec blade1 7 1 local # blade 1 local e coo; -mbdy momentvec blade1 8 1 local # blade 1 local e coo; -mbdy momentvec blade1 9 1 local # blade 1 local e coo; -mbdy momentvec blade1 10 1 local # blade 1 local e coo; -mbdy momentvec blade1 11 1 local # blade 1 local e coo; -mbdy momentvec blade1 12 1 local # blade 1 local e coo; -mbdy momentvec blade1 13 1 local # blade 1 local e coo; -mbdy momentvec blade1 14 1 local # blade 1 local e coo; -mbdy momentvec blade1 15 1 local # blade 1 local e coo; -mbdy momentvec blade1 16 1 local # blade 1 local e coo; -mbdy momentvec blade1 17 1 local # blade 1 local e coo; -mbdy momentvec blade1 18 1 local # blade 1 local e coo; -mbdy momentvec blade1 19 1 local # blade 1 local e coo; -mbdy momentvec blade1 19 2 local # blade 1 local e coo; -mbdy forcevec blade1 1 1 blade1 # blade 1 blade1 e coo; -mbdy forcevec blade1 2 1 blade1 # blade 1 blade1 e coo; -mbdy forcevec blade1 3 1 blade1 # blade 1 blade1 e coo; -mbdy forcevec blade1 4 1 blade1 # blade 1 blade1 e coo; -mbdy forcevec blade1 5 1 blade1 # blade 1 blade1 e coo; -mbdy forcevec blade1 6 1 blade1 # blade 1 blade1 e coo; -mbdy forcevec blade1 7 1 blade1 # blade 1 blade1 e coo; -mbdy forcevec blade1 8 1 blade1 # blade 1 blade1 e coo; -mbdy forcevec blade1 9 1 blade1 # blade 1 blade1 e coo; -mbdy forcevec blade1 10 1 blade1 # blade 1 blade1 e coo; -mbdy forcevec blade1 11 1 blade1 # blade 1 blade1 e coo; -mbdy forcevec blade1 12 1 blade1 # blade 1 blade1 e coo; -mbdy forcevec blade1 13 1 blade1 # blade 1 blade1 e coo; -mbdy forcevec blade1 14 1 blade1 # blade 1 blade1 e coo; -mbdy forcevec blade1 15 1 blade1 # blade 1 blade1 e coo; -mbdy forcevec blade1 16 1 blade1 # blade 1 blade1 e coo; -mbdy forcevec blade1 17 1 blade1 # blade 1 blade1 e coo; -mbdy forcevec blade1 18 1 blade1 # blade 1 blade1 e coo; -mbdy forcevec blade1 19 1 blade1 # blade 1 blade1 e coo; -mbdy forcevec blade1 19 2 blade1 # blade 1 blade1 e coo; -mbdy momentvec blade1 1 1 blade1 # blade 1 blade1 e coo; -mbdy momentvec blade1 2 1 blade1 # blade 1 blade1 e coo; -mbdy momentvec blade1 3 1 blade1 # blade 1 blade1 e coo; -mbdy momentvec blade1 4 1 blade1 # blade 1 blade1 e coo; -mbdy momentvec blade1 5 1 blade1 # blade 1 blade1 e coo; -mbdy momentvec blade1 6 1 blade1 # blade 1 blade1 e coo; -mbdy momentvec blade1 7 1 blade1 # blade 1 blade1 e coo; -mbdy momentvec blade1 8 1 blade1 # blade 1 blade1 e coo; -mbdy momentvec blade1 9 1 blade1 # blade 1 blade1 e coo; -mbdy momentvec blade1 10 1 blade1 # blade 1 blade1 e coo; -mbdy momentvec blade1 11 1 blade1 # blade 1 blade1 e coo; -mbdy momentvec blade1 12 1 blade1 # blade 1 blade1 e coo; -mbdy momentvec blade1 13 1 blade1 # blade 1 blade1 e coo; -mbdy momentvec blade1 14 1 blade1 # blade 1 blade1 e coo; -mbdy momentvec blade1 15 1 blade1 # blade 1 blade1 e coo; -mbdy momentvec blade1 16 1 blade1 # blade 1 blade1 e coo; -mbdy momentvec blade1 17 1 blade1 # blade 1 blade1 e coo; -mbdy momentvec blade1 18 1 blade1 # blade 1 blade1 e coo; -mbdy momentvec blade1 19 1 blade1 # blade 1 blade1 e coo; -mbdy momentvec blade1 19 2 blade1 # blade 1 blade1 e coo; -end output; -; -exit; \ No newline at end of file diff --git a/wetb/hawc2/tests/test_htc_file.py b/wetb/hawc2/tests/test_htc_file.py index ec018d1590524a3850dd7e70d25784e1baebd56e..9c5f5293287fca0e243fb27bd91b5f178ec49190 100644 --- a/wetb/hawc2/tests/test_htc_file.py +++ b/wetb/hawc2/tests/test_htc_file.py @@ -7,7 +7,7 @@ import os import unittest from datetime import datetime -from wetb.hawc2.htc_file import HTCFile +from wetb.hawc2.htc_file import HTCFile, HTCLine os.chdir(os.path.relpath(".", __file__)) @@ -20,15 +20,17 @@ class Test(unittest.TestCase): def setUp(self): unittest.TestCase.setUp(self) - self.testfilepath = "tests/test_files/" + self.testfilepath = "tests/test_files/htcfiles/" - def test_htc_file(self): - with open(self.testfilepath + 'test.htc') as fid: + + def check_htc_file(self, f): + + with open(f) as fid: orglines = fid.readlines() - htcfile = HTCFile(self.testfilepath + "test.htc") + htcfile = HTCFile(f) newlines = str(htcfile).split("\n") - #htcfile.save(self.testfilepath + 'tmp.htc') + htcfile.save(self.testfilepath + 'tmp.htc') #with open(self.testfilepath + 'tmp.htc') as fid: # newlines = fid.readlines() @@ -43,27 +45,41 @@ class Test(unittest.TestCase): print () assert len(orglines) == len(newlines) + def test_htc_files(self): + for f in ['test3.htc']: + self.check_htc_file(self.testfilepath + f) + + def test_htc_file_get(self): - htcfile = HTCFile(self.testfilepath + "test.htc") - self.assertEqual(htcfile['simulation']['logfile'][0], './logfiles/dlc12_iec61400-1ed3/dlc12_wsp10_wdir000_s1004.log') - self.assertEqual(htcfile['simulation/logfile'], './logfiles/dlc12_iec61400-1ed3/dlc12_wsp10_wdir000_s1004.log') - self.assertEqual(htcfile.simulation.logfile, './logfiles/dlc12_iec61400-1ed3/dlc12_wsp10_wdir000_s1004.log') - self.assertEqual(float(htcfile.simulation.newmark.deltat), 0.02) - self.assertEqual(htcfile.simulation.newmark, "deltat\t 0.02;\n") - s = """time_stop\t 100;\nsolvertype\t 1""" + htcfile = HTCFile(self.testfilepath + "test3.htc") + self.assertEqual(htcfile['simulation']['time_stop'][0], 200) + self.assertEqual(htcfile['simulation/time_stop'][0], 200) + self.assertEqual(htcfile['simulation.time_stop'][0], 200) + self.assertEqual(htcfile.simulation.time_stop[0], 200) + self.assertEqual(htcfile.dll.type2_dll.name[0], "risoe_controller") + self.assertEqual(htcfile.dll.type2_dll__2.name[0], "risoe_controller2") + s = """begin simulation;\n time_stop\t200;""" self.assertEqual(str(htcfile.simulation)[:len(s)], s) + def test_htc_file_get2(self): + htcfile = HTCFile(self.testfilepath + "test.htc") + self.assertEqual(htcfile['simulation']['logfile'][0], './logfiles/dlc12_iec61400-1ed3/dlc12_wsp10_wdir000_s1004.log') + self.assertEqual(htcfile['simulation/logfile'][0], './logfiles/dlc12_iec61400-1ed3/dlc12_wsp10_wdir000_s1004.log') + self.assertEqual(htcfile['simulation.logfile'][0], './logfiles/dlc12_iec61400-1ed3/dlc12_wsp10_wdir000_s1004.log') + self.assertEqual(htcfile.simulation.logfile[0], './logfiles/dlc12_iec61400-1ed3/dlc12_wsp10_wdir000_s1004.log') + self.assertEqual(htcfile.simulation.newmark.deltat[0], 0.02) def test_htc_file_set(self): htcfile = HTCFile(self.testfilepath + "test.htc") - time_stop = int(htcfile.simulation.time_stop) + time_stop = htcfile.simulation.time_stop[0] htcfile.simulation.time_stop = time_stop * 2 - self.assertEqual(int(htcfile.simulation.time_stop), 2 * time_stop) + self.assertEqual(htcfile.simulation.time_stop[0], 2 * time_stop) + self.assertEqual(htcfile.simulation.time_stop.__class__, HTCLine) def test_htc_file_set_key(self): htcfile = HTCFile(self.testfilepath + "test.htc") htcfile.simulation.name = "value" - self.assertEqual(htcfile.simulation.name, "value") + self.assertEqual(htcfile.simulation.name[0], "value") def test_htc_file_del_key(self): htcfile = HTCFile(self.testfilepath + "test.htc") @@ -84,20 +100,23 @@ class Test(unittest.TestCase): def test_add_section(self): htcfile = HTCFile() htcfile.wind.add_section('mann') - htcfile.wind.mann.create_turb_parameters = ("29.4 1.0 3.9 1004 1.0", "L, alfaeps, gamma, seed, highfrq compensation") - self.assertTrue(htcfile.wind.mann.create_turb_parameters.startswith('29.4')) + htcfile.wind.mann.add_line("create_turb_parameters", [29.4, 1.0, 3.9, 1004, 1.0], "L, alfaeps, gamma, seed, highfrq compensation") + self.assertEqual(htcfile.wind.mann.create_turb_parameters[0], 29.4) + self.assertEqual(htcfile.wind.mann.create_turb_parameters[3], 1004) + self.assertEqual(htcfile.wind.mann.create_turb_parameters.comments, "L, alfaeps, gamma, seed, highfrq compensation") def test_add_mann(self): htcfile = HTCFile() htcfile.add_mann_turbulence(30.1, 1.1, 3.3, 102, False) - s = """create_turb_parameters\t30.10 1.100 3.30 102 0;\tL, alfaeps, gamma, seed, highfrq compensation -filename_u\t./turb/turb_wsp10_s0102u.bin; -filename_v\t./turb/turb_wsp10_s0102v.bin; -filename_w\t./turb/turb_wsp10_s0102w.bin; -box_dim_u\t4096 1.4652; -box_dim_v\t32 3.2258; -box_dim_w\t32 3.2258; -std_scaling\t1.000000 0.800000 0.500000;""" + s = """begin mann; + create_turb_parameters\t30.1 1.1 3.3 102 0;\tL, alfaeps, gamma, seed, highfrq compensation + filename_u\t./turb/turb_wsp10_s0102u.bin; + filename_v\t./turb/turb_wsp10_s0102v.bin; + filename_w\t./turb/turb_wsp10_s0102w.bin; + box_dim_u\t4096 1.4652; + box_dim_v\t32 3.2258; + box_dim_w\t32 3.2258; + std_scaling\t1.000000 0.800000 0.500000;""" for a, b in zip(s.split("\n"), str(htcfile.wind.mann).split("\n")): self.assertEqual(a, b) @@ -105,14 +124,72 @@ std_scaling\t1.000000 0.800000 0.500000;""" def test_sensors(self): htcfile = HTCFile() htcfile.set_name("test") - htcfile.add_sensor('wind free_wind 1 0 0 -30') - s = """filename\t./res/test; -general time; -wind free_wind 1 0 0 -30;""" + htcfile.output.add_sensor('wind', 'free_wind', [1, 0, 0, -30]) + s = """begin output; + filename\t./res/test; + general time; + wind free_wind\t1 0 0 -30;""" for a, b in zip(s.split("\n"), str(htcfile.output).split("\n")): self.assertEqual(a, b) #print (htcfile) + + def test_output_at_time(self): + htcfile = HTCFile(self.testfilepath + "test2.htc") + self.assertTrue('begin output_at_time aero 15.0;' in str(htcfile)) + + + def test_output_files(self): + htcfile = HTCFile(self.testfilepath + "test.htc") + output_files = htcfile.output_files() + #print (htcfile.output) + for f in ['./logfiles/dlc12_iec61400-1ed3/dlc12_wsp10_wdir000_s1004.log', + './visualization/dlc12_wsp10_wdir000_s1004.hdf5', + './animation/structure_aero_control_turb.dat', + './res_eigen/dlc12_iec61400-1ed3/dlc12_wsp10_wdir000_s1004/dlc12_iec61400-1ed3/dlc12_wsp10_wdir000_s1004/dlc12_wsp10_wdir000_s1004_beam.dat', + './res_eigen/dlc12_iec61400-1ed3/dlc12_wsp10_wdir000_s1004/dlc12_iec61400-1ed3/dlc12_wsp10_wdir000_s1004/dlc12_wsp10_wdir000_s1004_body.dat', + './res_eigen/dlc12_iec61400-1ed3/dlc12_wsp10_wdir000_s1004/dlc12_iec61400-1ed3/dlc12_wsp10_wdir000_s1004/dlc12_wsp10_wdir000_s1004_struct.dat', + './res_eigen/dlc12_iec61400-1ed3/dlc12_wsp10_wdir000_s1004/dlc12_iec61400-1ed3/dlc12_wsp10_wdir000_s1004/dlc12_wsp10_wdir000_s1004_body_eigen.dat', + './res_eigen/dlc12_iec61400-1ed3/dlc12_wsp10_wdir000_s1004/dlc12_iec61400-1ed3/dlc12_wsp10_wdir000_s1004/dlc12_wsp10_wdir000_s1004_strc_eigen.dat', + './res/dlc12_iec61400-1ed3/dlc12_wsp10_wdir000_s1004.sel', + './res/dlc12_iec61400-1ed3/dlc12_wsp10_wdir000_s1004.dat', + './res/rotor_check_inipos', + './res/rotor_check_inipos2']: + try: + output_files.remove(f) + except ValueError: + raise ValueError(f + " is not in list") + self.assertFalse(output_files) + + def test_turbulence_files(self): + htcfile = HTCFile(self.testfilepath + "dlc14_wsp10_wdir000_s0000.htc") + self.assertEqual(htcfile.turbulence_files(), ['./turb/turb_wsp10_s0000u.bin', './turb/turb_wsp10_s0000v.bin', './turb/turb_wsp10_s0000w.bin']) + + def test_input_files(self): + htcfile = HTCFile(self.testfilepath + "test.htc") + input_files = htcfile.input_files() + #print (htcfile.output) + for f in ['./data/DTU_10MW_RWT_Tower_st.dat', + './data/DTU_10MW_RWT_Towertop_st.dat', + './data/DTU_10MW_RWT_Shaft_st.dat', + './data/DTU_10MW_RWT_Hub_st.dat', + 'data/2Bdown-rR1.08_blade_st.dat', + './data/2Bdown-rR1.08_ae.dat', + './data/2Bup_AEP095_pc.dat', + './control/risoe_controller.dll', + './control/generator_servo.dll', + './control/mech_brake.dll', + './control/servo_with_limits.dll', + './control/towclearsens.dll', + 'tests/test_files/htcfiles/test.htc' + ]: + try: + input_files.remove(f) + except ValueError: + raise ValueError(f + " is not in list") + self.assertFalse(input_files) + + if __name__ == "__main__": #import sys;sys.argv = ['', 'Test.testName'] unittest.main()