From e6e099a8a0fae050e992a24fc666d0673e447a9d Mon Sep 17 00:00:00 2001 From: "Mads M. Pedersen" <mmpe@dtu.dk> Date: Thu, 23 Feb 2017 08:11:45 +0100 Subject: [PATCH] optional curved_length or radius in at_time_file.py --- wetb/hawc2/at_time_file.py | 23 ++++++++++++++++------- wetb/hawc2/tests/test_AtTimeFile.py | 25 ++++++++++++++++--------- 2 files changed, 32 insertions(+), 16 deletions(-) diff --git a/wetb/hawc2/at_time_file.py b/wetb/hawc2/at_time_file.py index 642225e..10ed858 100644 --- a/wetb/hawc2/at_time_file.py +++ b/wetb/hawc2/at_time_file.py @@ -15,6 +15,8 @@ standard_library.install_aliases() import numpy as np class AtTimeFile(object): """Loads an at time file generated by HAWC2 + + Note that the radius in this context is the curved radius >>> atfile = AtTimeFile("at_time.dat") # load file >>> atfile.attribute_names # Attribute names @@ -23,27 +25,34 @@ class AtTimeFile(object): [ 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) + >>> atfile.twist(curved_length=10) # Twist at curved_length = 10 (interpolated) + -5.34743208242399 + >>> atfile.twist(radius=10) # Twist at curved_length = 10 (interpolated) -5.34743208242399 """ - def __init__(self, filename): + def __init__(self, filename, blade_radius=None): + self.blade_radius = blade_radius with open(filename, encoding='utf-8') 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: + def values(radius=None, curved_length=None): + assert radius is None or curved_length is None, "Specify either radius or curved_length" + if radius is None and curved_length is None: return self.data[:, column] + elif radius is not None: + assert self.blade_radius is not None, "blade_radius must be specified in __init__ when requesting value of radius (alternatively you can request for curved_length)" + return np.interp(radius/self.blade_radius, self.data[:, 0]/self.data[-1, 0], self.data[:, column]) else: - return np.interp(radius, self.data[:, 0], self.data[:, column]) + return np.interp(curved_length, 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 curved_radius(self, radius=None): - """Radius of calculation point(s) + def ac_radius(self, radius=None): + """Radius (curved distance) of aerodynamic calculation point(s) Parameters ---------- diff --git a/wetb/hawc2/tests/test_AtTimeFile.py b/wetb/hawc2/tests/test_AtTimeFile.py index b132016..6f17562 100644 --- a/wetb/hawc2/tests/test_AtTimeFile.py +++ b/wetb/hawc2/tests/test_AtTimeFile.py @@ -24,11 +24,12 @@ class TestAtTimeFile(unittest.TestCase): def test_doc_examples(self): - atfile = AtTimeFile(self.testfilepath + "at_time.dat") # load file + atfile = AtTimeFile(self.testfilepath + "at_time.dat", blade_radius=20.501) # 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) + self.assertAlmostEqual(atfile.twist(radius=10), -5.34743208242399) # Twist at radius = 10 (interpolated) + self.assertEqual(atfile.twist(curved_length=10), -5.34743208242399) # Twist at radius = 10 (interpolated) @@ -40,18 +41,24 @@ class TestAtTimeFile(unittest.TestCase): self.assertEqual(atfile.chord()[9], 1.54999) - def test_at_time_file_at_radius(self): + def test_at_time_file_at_curved_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) + self.assertEqual(atfile.radius_s(curved_length=9), 9) + self.assertEqual(atfile.twist(curved_length=9), -6.635983309665461) + self.assertEqual(atfile.chord(curved_length=9), 1.3888996578373045) + + def test_at_time_file_at_radius(self): + atfile = AtTimeFile(self.testfilepath + "at_time.dat", blade_radius=20.501/2) + self.assertEqual(atfile.radius_s(radius=9/2), 9) + self.assertEqual(atfile.twist(radius=9/2), -6.635983309665461) + self.assertEqual(atfile.chord(radius=9/2), 1.3888996578373045) def test_at_time_file_radius(self): atfile = AtTimeFile(self.testfilepath + "at_time.dat") - self.assertEqual(atfile.curved_radius()[12], 10.2505) - self.assertEqual(atfile.curved_radius(10), 10.2505) - self.assertEqual(atfile.curved_radius(10.5), 10.2505) + self.assertEqual(atfile.ac_radius()[12], 10.2505) + self.assertEqual(atfile.ac_radius(10), 10.2505) + self.assertEqual(atfile.ac_radius(10.5), 10.2505) if __name__ == "__main__": #import sys;sys.argv = ['', 'Test.testName'] -- GitLab