diff --git a/wetb/hawc2/at_time_file.py b/wetb/hawc2/at_time_file.py new file mode 100644 index 0000000000000000000000000000000000000000..68abb64cec88b0a11b5bafd77eebfc03f6d3cf67 --- /dev/null +++ b/wetb/hawc2/at_time_file.py @@ -0,0 +1,68 @@ +''' +Created on 24/04/2014 + +@author: MMPE +''' + +import numpy as np +class AtTimeFile(object): + """Loads an at time file generated by HAWC2 + + >>> atfile = AtTimeFile("at_time.dat") # load file + >>> atfile.attribute_names # Attribute names + ['radius_s', 'twist', 'chord'] + >>> atfile[:3,1]) # first 3 twist rows + [ 0. -0.775186 -2.91652 ] + >>> atfile.twist()[:3]) # first 3 twist rows + [ 0. -0.775186 -2.91652 ] + >>> atfile.twist(10) # Twist at radius = 10 (interpolated) + -5.34743208242399 + """ + def __init__(self, filename): + with open(filename) as fid: + lines = fid.readlines() + self.attribute_names = lines[2].lower().replace("#", "").split() + data = np.array([[float(l) for l in lines[i].split() ] for i in range(3, len(lines))]) + self.data = data + def func_factory(column): + def values(radius=None): + if radius is None: + return self.data[:, column] + else: + return np.interp(radius, self.data[:, 0], self.data[:, column]) + return values + for column, att_name in enumerate(self.attribute_names): + setattr(self, att_name, func_factory(column)) + + def radius(self, radius=None): + """Radius of calculation point(s) + + Parameters + ---------- + radius : int or float, optional + - if None (default): Radius of calculation points\n + - if int or float: Radius of calculation point nearest radius + + Returns + ------- + radius : float or array_like + Radius of calculation points or radius of calculation point nearest radius + """ + if radius is None: + return self.radius_s(radius) + else: + return self.radius_s()[np.argmin(np.abs(self.radius_s() - radius))] + + def value(self, radius, column): + return np.interp(radius, self.data[:, 0], self.data[:, column]) + + def __getitem__(self, subset): + return self.data[subset] + + +if __name__ == "__main__": + at = AtTimeFile(r"tests/test_files/at_time.dat") + print (at.attribute_names) + print (at.twist(36)) + print (at.chord(36)) + diff --git a/wetb/hawc2/tests/test_AtTimeFile.py b/wetb/hawc2/tests/test_AtTimeFile.py new file mode 100644 index 0000000000000000000000000000000000000000..db0798805c40abfe104adef886d4e584ee8b6c69 --- /dev/null +++ b/wetb/hawc2/tests/test_AtTimeFile.py @@ -0,0 +1,51 @@ +''' +Created on 17/07/2014 + +@author: MMPE +''' +import unittest +from wetb.hawc2.at_time_file import AtTimeFile +import numpy as np + + + +class Test(unittest.TestCase): + + def setUp(self): + unittest.TestCase.setUp(self) + self.testfilepath = "test_files/" + + + def test_doc_examples(self): + atfile = AtTimeFile(self.testfilepath + "at_time.dat") # load file + self.assertEqual(atfile.attribute_names, ['radius_s', 'twist', 'chord']) + np.testing.assert_array_equal(atfile[:3, 1], [ 0., -0.775186, -2.91652 ]) + np.testing.assert_array_equal(atfile.twist()[:3], [ 0. , -0.775186 , -2.91652 ]) + self.assertEqual(atfile.twist(10), -5.34743208242399) # Twist at radius = 10 (interpolated) + + + + def test_at_time_file(self): + atfile = AtTimeFile(self.testfilepath + "at_time.dat") + self.assertEqual(atfile.attribute_names, ['radius_s', 'twist', 'chord']) + self.assertEqual(atfile.radius_s()[9], 6.32780) + self.assertEqual(atfile.twist()[9], -13.5373) + self.assertEqual(atfile.chord()[9], 1.54999) + + + def test_at_time_file_at_radius(self): + atfile = AtTimeFile(self.testfilepath + "at_time.dat") + self.assertEqual(atfile.radius_s(9), 9) + self.assertEqual(atfile.twist(9), -6.635983309665461) + self.assertEqual(atfile.chord(9), 1.3888996578373045) + + + def test_at_time_file_radius(self): + atfile = AtTimeFile(self.testfilepath + "at_time.dat") + self.assertEqual(atfile.radius()[12], 10.2505) + self.assertEqual(atfile.radius(10), 10.2505) + self.assertEqual(atfile.radius(10.5), 10.2505) + +if __name__ == "__main__": + #import sys;sys.argv = ['', 'Test.testName'] + unittest.main() diff --git a/wetb/hawc2/tests/test_files/at_time.dat b/wetb/hawc2/tests/test_files/at_time.dat new file mode 100644 index 0000000000000000000000000000000000000000..b8fa5f4342ec720599b1f198fa8179aca11be5a1 --- /dev/null +++ b/wetb/hawc2/tests/test_files/at_time.dat @@ -0,0 +1,28 @@ + # Version ID : HAWC2AERO 2.4w + # Radial output at time: 1.00000000000000 +# Radius_s # twist # Chord + 0.00000E+00 0.00000E+00 1.00000E-03 + 8.76944E-02 -7.75186E-01 1.00000E-03 + 3.49277E-01 -2.91652E+00 1.00000E-03 + 7.80273E-01 -5.85792E+00 1.00000E-03 + 1.37331E+00 -8.61678E+00 1.00000E-03 + 2.11823E+00 -8.54428E+00 8.30976E-01 + 3.00230E+00 -1.25115E+01 1.25260E+00 + 4.01039E+00 -1.75520E+01 1.51878E+00 + 5.12525E+00 -1.76464E+01 1.61724E+00 + 6.32780E+00 -1.35373E+01 1.54999E+00 + 7.59748E+00 -9.71721E+00 1.45905E+00 + 8.91254E+00 -6.74868E+00 1.39442E+00 + 1.02505E+01 -5.02465E+00 1.30997E+00 + 1.15885E+01 -3.92039E+00 1.22316E+00 + 1.29035E+01 -2.82899E+00 1.13556E+00 + 1.41732E+01 -2.04828E+00 1.04888E+00 + 1.53758E+01 -1.39988E+00 9.63946E-01 + 1.64906E+01 -9.33385E-01 8.80714E-01 + 1.74987E+01 -5.70469E-01 7.94120E-01 + 1.83828E+01 -2.98853E-01 6.90240E-01 + 1.91277E+01 -1.22955E-01 5.56800E-01 + 1.97207E+01 -3.28925E-02 3.86719E-01 + 2.01517E+01 -2.73822E-03 2.11422E-01 + 2.04133E+01 1.14111E-03 8.17689E-02 + 2.05010E+01 0.00000E+00 3.60000E-02