Skip to content
Snippets Groups Projects
Commit 362949a3 authored by mads's avatar mads
Browse files

added ae + pc file + test

parent 95bee440
No related branches found
No related tags found
No related merge requests found
......@@ -4,6 +4,8 @@
- [Hawc2io](wetb/hawc2/Hawc2io.py): Read binary, ascii and flex result files
- [sel_file](wetb/hawc2/sel_file.py): Read/write *.sel (sensor list) files
- [htcfile](wetb/hawc2/htcfile.py): Read/write/manipulate htc files
- [ae_file](wetb/hawc2/ae_file.py): Read AE (aerodynamic blade layout) files
- [pc_file](wetb/hawc2/pc_file.py): Read PC (profile coefficient) files
- [shearfile](wetb/hawc2/shearfile.py): Create user defined shear file
- [at_time_file](wetb/hawc2/at_time_file.py): read at output_at_time files
......
'''
Created on 24/04/2014
@author: MMPE
'''
import numpy as np
class AEFile(object):
"""Read HAWC2 AE (aerodynamic blade layout) file
examples
--------
>>> aefile = AEFile(r"tests/test_files/NREL_5MW_ae.txt")
>>> print (aefile.thickness(36)) # Interpolated thickness at radius 36
23.78048780487805
>>> print (aefile.chord(36)) # Interpolated chord at radius 36
3.673
>>> print (aefile.pc_set_nr(36)) # pc set number at radius 36
1
"""
def __init__(self, filename):
with open (filename) as fid:
lines = fid.readlines()
nsets = int(lines[0].split()[0])
lptr = 1
self.ae_sets = {}
for _ in range(1, nsets + 1):
for _ in range(nsets):
set_nr, n_rows = [int(v) for v in lines[lptr ].split()[:2]]
lptr += 1
data = np.array([[float(v) for v in l.split()[:4]] for l in lines[lptr:lptr + n_rows]])
self.ae_sets[set_nr] = data
lptr += n_rows
def _value(self, radius, column, set_nr=1):
ae_data = self.ae_sets[set_nr]
return np.interp(radius, ae_data[:, 0], ae_data[:, column])
def chord(self, radius, set_nr=1):
return self._value(radius, 1, set_nr)
def thickness(self, radius, set_nr=1):
return self._value(radius, 2, set_nr)
def pc_set_nr(self, radius, set_nr=1):
ae_data = self.ae_sets[set_nr]
index = np.searchsorted(ae_data[:, 0], radius)
index = max(1, index)
setnr1, setnr2 = ae_data[index - 1:index + 1, 3]
if setnr1 != setnr2:
raise NotImplementedError
return setnr1
if __name__ == "__main__":
ae = AEFile(r"tests/test_files/NREL_5MW_ae.txt")
print (ae.thickness(36))
print (ae.chord(36))
print (ae.pc_set_nr(36))
'''
Created on 24/04/2014
@author: MMPE
'''
from wetb.hawc2.ae_file import AEFile
import numpy as np
class PCFile(AEFile):
"""Read HAWC2 PC (profile coefficients) file
examples
--------
>>> pcfile = PCFile("tests/test_files/NREL_5MW_pc.txt", "tests/test_files/NREL_5MW_ae.txt")
# Same attributes as AEFile
>>> pcfile.thickness(36) # Interpolated thickness at radius 36
23.78048780487805
>>> pcfile.chord(36) # Interpolated chord at radius 36
3.673
>>> pcfile.pc_set_nr(36) # pc set number at radius 36
1
# Additional attributes
>>> pcfile.CL(36,10) # CL at radius=36m and AOA=10deg
1.358
>>> pcfile.CD(36,10) # CD at radius=36m and AOA=10deg
0.0255
>>> pcfile.CM(36,10) # CM at radius=36m and AOA=10deg
-0.1103
"""
def __init__(self, filename, ae_filename):
AEFile.__init__(self, ae_filename)
with open (filename) as fid:
lines = fid.readlines()
nsets = int(lines[0].split()[0])
self.sets = {}
lptr = 1
for nset in range(1, nsets + 1):
nprofiles = int(lines[lptr].split()[0])
lptr += 1
#assert nprofiles >= 2
thicknesses = []
profiles = []
for profile_nr in range(nprofiles):
profile_nr, n_rows, thickness = lines[lptr ].split()[:3]
profile_nr, n_rows, thickness = int(profile_nr), int(n_rows), float(thickness)
lptr += 1
data = np.array([[float(v) for v in l.split()[:4]] for l in lines[lptr:lptr + n_rows]])
thicknesses.append(thickness)
profiles.append(data)
lptr += n_rows
self.sets[nset] = (np.array(thicknesses), profiles)
def _Cxxx(self, radius, alpha, column, ae_set_nr=1):
thickness = self.thickness(radius, ae_set_nr)
pc_set_nr = self.pc_set_nr(radius, ae_set_nr)
thicknesses, profiles = self.sets[pc_set_nr]
index = np.searchsorted(thicknesses, thickness)
if index == 0:
index = 1
Cx0, Cx1 = profiles[index - 1:index + 1]
Cx0 = np.interp(alpha, Cx0[:, 0], Cx0[:, column])
Cx1 = np.interp(alpha, Cx1[:, 0], Cx1[:, column])
th0, th1 = thicknesses[index - 1:index + 1]
return Cx0 + (Cx1 - Cx0) * (thickness - th0) / (th1 - th0)
def CL(self, radius, alpha, ae_set_nr=1):
return self._Cxxx(radius, alpha, 1, ae_set_nr)
def CD(self, radius, alpha, ae_set_nr=1):
return self._Cxxx(radius, alpha, 2, ae_set_nr)
def CM(self, radius, alpha, ae_set_nr=1):
return self._Cxxx(radius, alpha, 3, ae_set_nr)
if __name__ == "__main__":
pc = PCFile(r"C:\mmpe\Projects\inflow\Hawc2aero_setup/data/Hawc_pc.b52", r"C:\mmpe\Projects\inflow\Hawc2aero_setup/data/S36_ae_h2.001")
print (pc)
'''
Created on 05/11/2015
@author: MMPE
'''
import unittest
from wetb.hawc2.ae_file import AEFile
testfilepath = 'test_files/'
class Test(unittest.TestCase):
def test_aefile(self):
ae = AEFile(testfilepath + "NREL_5MW_ae.txt")
self.assertEqual(ae.thickness(38.950), 21)
self.assertEqual(ae.chord(38.950), 3.256)
self.assertEqual(ae.pc_set_nr(38.950), 1)
def test_aefile_interpolate(self):
ae = AEFile(testfilepath + "NREL_5MW_ae.txt")
self.assertEqual(ae.thickness(32), 23.78048780487805)
self.assertEqual(ae.chord(32), 3.673)
self.assertEqual(ae.pc_set_nr(32), 1)
print (ae.thickness(32))
print (ae.chord(32))
print (ae.pc_set_nr(32))
if __name__ == "__main__":
#import sys;sys.argv = ['', 'Test.testName']
unittest.main()
1 Chord[m] T/C[%] Set no.
1 19 Blade
0.000 3.542 100 1
1.367 3.542 100 1
4.100 3.854 100 1
6.833 4.167 90 1
10.250 4.557 40 1
14.350 4.652 35 1
18.450 4.458 35 1
22.550 4.249 30 1
26.650 4.007 25 1
30.750 3.748 25 1
34.850 3.502 21 1
38.950 3.256 21 1
43.050 3.01 17 1
47.150 2.764 17 1
51.250 2.518 17 1
54.667 2.313 17 1
57.400 2.086 17 1
60.133 1.419 17 1
61.500 0.961 17 1
This diff is collapsed.
'''
Created on 17/07/2014
@author: MMPE
'''
import os
import unittest
from wetb.hawc2.pc_file import PCFile
import numpy as np
class Test(unittest.TestCase):
def setUp(self):
unittest.TestCase.setUp(self)
self.testfilepath = "test_files/"
def test_PCFile_ae(self):
pc = PCFile(self.testfilepath + "NREL_5MW_pc.txt", self.testfilepath + "NREL_5MW_ae.txt")
self.assertEqual(pc.thickness(32), 23.78048780487805)
self.assertEqual(pc.chord(32), 3.673)
self.assertEqual(pc.pc_set_nr(32), 1)
def test_PCFile2(self):
pc = PCFile(self.testfilepath + "NREL_5MW_pc.txt", self.testfilepath + "NREL_5MW_ae.txt")
self.assertEqual(pc.CL(36, 10), 1.358)
self.assertEqual(pc.CD(36, 10), 0.0255)
self.assertEqual(pc.CM(36, 10), -0.1103)
if __name__ == "__main__":
#import sys;sys.argv = ['', 'Test.testName']
unittest.main()
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