Skip to content
Snippets Groups Projects
Commit e6e099a8 authored by Mads M. Pedersen's avatar Mads M. Pedersen
Browse files

optional curved_length or radius in at_time_file.py

parent bafaf8ff
No related branches found
No related tags found
No related merge requests found
......@@ -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
----------
......
......@@ -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']
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment