diff --git a/wetb/hawc2/htc_extensions.py b/wetb/hawc2/htc_extensions.py new file mode 100644 index 0000000000000000000000000000000000000000..67b9f7fe0bccbc5b08d9dfb1268cc9eb2058355e --- /dev/null +++ b/wetb/hawc2/htc_extensions.py @@ -0,0 +1,160 @@ +''' +Created on 20/01/2014 + +@author: MMPE + +See documentation of HTCFile below + +''' +from __future__ import division +from __future__ import unicode_literals +from __future__ import print_function +from __future__ import absolute_import +from builtins import zip +from builtins import int +from builtins import str +from future import standard_library +import os +from wetb.wind.shear import log_shear, power_shear +standard_library.install_aliases() + + + +class HTCDefaults(object): + + + 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;""" + + + def add_mann_turbulence(self, L=29.4, ae23=1, Gamma=3.9, seed=1001, high_frq_compensation=True, + filenames=None, + 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') + if 'create_turb_parameters' in mann: + mann.create_turb_parameters.values = [L, ae23, Gamma, seed, int(high_frq_compensation)] + else: + mann.add_line('create_turb_parameters', [L, ae23, Gamma, seed, int(high_frq_compensation)], "L, alfaeps, gamma, seed, highfrq compensation") + if filenames is None: + fmt = "mann_l%.1f_ae%.2f_g%.1f_h%d_%dx%dx%d_%.3fx%.2fx%.2f_s%04d%c.turb" + import numpy as np + dxyz = tuple(np.array(box_dimension) / no_grid_points) + filenames = ["./turb/" + fmt % ((L, ae23, Gamma, high_frq_compensation) + no_grid_points + dxyz + (seed, uvw)) for uvw 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 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] + with open (filename) as fid: + lines = fid.readlines() + K_r1 = float(lines[1].replace("K = ", '').replace("[Nm/(rad/s)^2]", '')) + Kp_r2 = float(lines[4].replace("Kp = ", '').replace("[Nm/(rad/s)]", '')) + Ki_r2 = float(lines[5].replace("Ki = ", '').replace("[Nm/rad]", '')) + Kp_r3 = float(lines[7].replace("Kp = ", '').replace("[rad/(rad/s)]", '')) + Ki_r3 = float(lines[8].replace("Ki = ", '').replace("[rad/rad]", '')) + KK = lines[9].split("]") + KK1 = float(KK[0].replace("K1 = ", '').replace("[deg", '')) + KK2 = float(KK[1].replace(", K2 = ", '').replace("[deg^2", '')) + cs = dtu_we_controller.init + cs.constant__11.values[1] = "%.6E" % K_r1 + cs.constant__12.values[1] = "%.6E" % Kp_r2 + cs.constant__13.values[1] = "%.6E" % Ki_r2 + cs.constant__16.values[1] = "%.6E" % Kp_r3 + cs.constant__17.values[1] = "%.6E" % Ki_r3 + cs.constant__21.values[1] = "%.6E" % KK1 + cs.constant__22.values[1] = "%.6E" % KK2 + + +class HTCExtensions(object): + def get_shear(self): + shear_type, parameter = self.wind.shear_format.values + z0 = -self.wind.center_pos0[2] + wsp = self.wind.wsp[0] + if shear_type==1: #constant + return lambda z : parameter + elif shear_type==3: + return power_shear(parameter, z0, wsp) + else: + raise NotImplementedError \ No newline at end of file diff --git a/wetb/hawc2/tests/test_files/data/user_shear.dat b/wetb/hawc2/tests/test_files/data/user_shear.dat new file mode 100644 index 0000000000000000000000000000000000000000..d8371b679430d84a5273bc6356871f24cb218c44 --- /dev/null +++ b/wetb/hawc2/tests/test_files/data/user_shear.dat @@ -0,0 +1,21 @@ + # autogenerated shear file + 2 3 + # shear v component + 0.0000000000 0.0000000000 + 0.0000000000 0.0000000000 + 0.0000000000 0.0000000000 + # shear u component + 0.8000000000 0.6000000000 + 1.0000000000 1.0000000000 + 1.2000000000 1.4000000000 + # shear w component + 0.0000000000 0.0000000000 + 0.0000000000 0.0000000000 + 0.0000000000 0.0000000000 + # v coordinates + -55.0000000000 + 55.0000000000 + # w coordinates + 30.0000000000 + 100.0000000000 + 160.0000000000 diff --git a/wetb/hawc2/tests/test_htc_extensions.py b/wetb/hawc2/tests/test_htc_extensions.py new file mode 100644 index 0000000000000000000000000000000000000000..fe84fbc2a1f4fb44dfeede46c4ed3adbe5c4c82b --- /dev/null +++ b/wetb/hawc2/tests/test_htc_extensions.py @@ -0,0 +1,33 @@ +''' +Created on 17/07/2014 + +@author: MMPE +''' +from __future__ import print_function +from __future__ import unicode_literals +from __future__ import division +from __future__ import absolute_import +from io import open +from builtins import str +from builtins import zip +from future import standard_library +standard_library.install_aliases() +import os +import unittest + +from datetime import datetime +from wetb.hawc2.htc_file import HTCFile, HTCLine + +import numpy as np + + +tfp = os.path.join(os.path.dirname(__file__), 'test_files/htcfiles/') # test file path +class TestHtcFile(unittest.TestCase): + + def test_get_shear(self): + htc = HTCFile(tfp+'test.htc') + self.assertEqual(htc.get_shear()(100), 10*(100/119)**.2) + +if __name__ == "__main__": + #import sys;sys.argv = ['', 'Test.testName'] + unittest.main()