diff --git a/wetb/hawc2/htc_contents.py b/wetb/hawc2/htc_contents.py index bd40ea4e2b004e22c953d6b472d774a7e53ee865..2df59c6014deb1c32c413f7b1863f21297463a71 100644 --- a/wetb/hawc2/htc_contents.py +++ b/wetb/hawc2/htc_contents.py @@ -14,6 +14,7 @@ from builtins import zip from builtins import int from builtins import str from future import standard_library +import os standard_library.install_aliases() from collections import OrderedDict import collections @@ -119,8 +120,8 @@ class HTCContents(object): ending = "__%d" % (1 + float("0%s" % ending.replace("__", ""))) self[contents.name_ + ending] = contents - def add_section(self, name, allow_duplicate_section=False): - if name in self and allow_duplicate_section is False: + def add_section(self, name, allow_duplicate=False): + if name in self and allow_duplicate is False: return self[name] section = HTCSection(name) self._add_contents(section) @@ -363,8 +364,9 @@ class HTCDefaults(object): 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)): + no_grid_points=(16384, 32, 32), box_dimension=(6000, 100, 100), + dont_scale=False, + std_scaling=None): wind = self.add_section('wind') wind.turb_format = 1 mann = wind.add_section('mann') @@ -383,15 +385,38 @@ class HTCDefaults(object): 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: + if dont_scale: mann.dont_scale = 1 else: try: del mann.dont_scale except KeyError: pass + if std_scaling is not None: mann.std_scaling = "%f %f %f" % std_scaling + else: + try: + del mann.std_scaling + except KeyError: + pass + + + + def add_turb_export(self, filename="export_%s.turb", samplefrq = None): + exp = self.wind.add_section('turb_export', allow_duplicate=True) + for uvw in 'uvw': + exp.add_line('filename_%s'%uvw, [filename%uvw]) + sf = samplefrq or max(1,int( self.wind.mann.box_dim_u[1]/(self.wind.wsp[0] * self.deltat()))) + exp.samplefrq = sf + if "time" in self.output: + exp.time_start = self.output.time[0] + else: + exp.time_start = 0 + exp.nsteps = (self.simulation.time_stop[0]-exp.time_start[0]) / self.deltat() + for vw in 'vw': + exp.add_line('box_dim_%s'%vw, self.wind.mann['box_dim_%s'%vw].values) + def import_dtu_we_controller_input(self, filename): dtu_we_controller = [dll for dll in self.dll if dll.name[0] == 'dtu_we_controller'][0] diff --git a/wetb/hawc2/htc_file.py b/wetb/hawc2/htc_file.py index 2ae9e14518d7c0f06903f92904e35d594bdcdcb3..087fb242f3e9aefa4eaa9a9a24573daebe11891d 100644 --- a/wetb/hawc2/htc_file.py +++ b/wetb/hawc2/htc_file.py @@ -197,7 +197,7 @@ class HTCFile(HTCContents, HTCDefaults): with open(filename, 'w', encoding='cp1252') as fid: fid.write(str(self)) - def set_name(self, name, htc_folder="htc", log_folder="log", res_folder="res"): + def set_name(self, name, htc_folder="htc", log_folder="log", res_folder="res", animation_folder='animation', visualization_folder="visualization"): #if os.path.isabs(folder) is False and os.path.relpath(folder).startswith("htc" + os.path.sep): self.contents #load if not loaded fmt_folder = lambda folder : "./" + os.path.relpath(folder).replace("\\", "/") @@ -207,6 +207,10 @@ class HTCFile(HTCContents, HTCDefaults): self.simulation.logfile = os.path.join(fmt_folder(log_folder), "%s.log" % name).replace("\\", "/") elif 'test_structure' in self and 'logfile' in self.test_structure: # hawc2aero self.test_structure.logfile = os.path.join(fmt_folder(log_folder), "%s.log" % name).replace("\\", "/") + if 'simulation' in self and 'animation' in self.simulation: + self.simulation.animation = os.path.join(fmt_folder(animation_folder), "%s.dat" % name).replace("\\", "/") + if 'simulation' in self and 'visualization' in self.simulation: + self.simulation.visualization = os.path.join(fmt_folder(visualization_folder), "%s.hdf5" % name).replace("\\", "/") self.output.filename = os.path.join(fmt_folder(res_folder), "%s" % name).replace("\\", "/") def set_time(self, start=None, stop=None, step=None): @@ -354,6 +358,20 @@ class HTCFile(HTCContents, HTCDefaults): if errorcode or 'Elapsed time' not in log: raise Exception (str(stdout) + str(stderr)) + + def deltat(self): + return self.simulation.newmark.deltat[0] + + def get_body(self, name): + lst = [b for b in self.new_htc_structure if b.name_=="main_body" and b.name[0]==name] + if len(lst)==1: + return lst[0] + else: + if len(lst)==0: + raise ValueError("Body '%s' not found"%name) + else: + raise NotImplementedError() + class H2aeroHTCFile(HTCFile): def __init__(self, filename=None, modelpath=None): diff --git a/wetb/hawc2/tests/test_htc_file.py b/wetb/hawc2/tests/test_htc_file.py index 8d2515f26998fb4fe134a7935f8d278c76a73d82..e96d3d16ee9cc69f3c9acdf35f7f23c687c7c8dd 100644 --- a/wetb/hawc2/tests/test_htc_file.py +++ b/wetb/hawc2/tests/test_htc_file.py @@ -159,6 +159,25 @@ class TestHtcFile(unittest.TestCase): self.assertEqual(a.strip(), b.strip()) self.assertEqual(htcfile.wind.turb_format[0], 1) self.assertEqual(htcfile.wind.turb_format.comments, "") + + def test_add_turb_export(self): + htc = HTCFile() + htc.add_mann_turbulence(30.1, 1.1, 3.3, 102, False) + htc.set_time(100,700,0.02) + htc.add_turb_export() + s = """begin turb_export; + filename_u\texport_u.turb; + filename_v\texport_v.turb; + filename_w\texport_w.turb; + samplefrq\t7; + time_start\t100; + nsteps\t30000.0; + box_dim_v\t32 3.2258; + box_dim_w\t32 3.2258; +end turb_export;""" + for a, b in zip(s.split("\n"), str(htc.wind.turb_export).split("\n")): + self.assertEqual(a.strip(), b.strip()) + def test_sensors(self):