From 9f95a5253151f242010dfa018d91ae442ed936d0 Mon Sep 17 00:00:00 2001 From: David Robert Verelst <dave@dtu.dk> Date: Sun, 18 Mar 2018 17:27:00 +0100 Subject: [PATCH] prepost.hawcstab2: add support for 3 set (real_eig) cmb file reading --- wetb/prepost/hawcstab2.py | 22 ++++++++++++++++------ wetb/prepost/tests/test_hawcstab2.py | 8 ++++++-- 2 files changed, 22 insertions(+), 8 deletions(-) diff --git a/wetb/prepost/hawcstab2.py b/wetb/prepost/hawcstab2.py index 3640068..abd99c3 100644 --- a/wetb/prepost/hawcstab2.py +++ b/wetb/prepost/hawcstab2.py @@ -121,17 +121,25 @@ class results(object): return ReadFileHAWCStab2Header(fname) def load_cmb(self, fname): - cmb = np.loadtxt(fname) + # aero-(servo)-elastic results for HS2>=2.14 have real_eig as 3th set + with open(fname) as f: + header = f.readline().replace('\n', '') + cmb = np.loadtxt(f) + # first column header has the units of the type of opearing points + cols = misc.remove_items(header.split(']')[1].split(' '), '') + nrmodes = np.array([int(k) for k in cols]).max() # when there is only data for one operating condition we only have one # row and consequently only a 1D array if len(cmb.shape) == 1: cmb = cmb.reshape( (1, cmb.shape[0]) ) wind = cmb[:,0] - ii = int((cmb.shape[1]-1)/2) - freq = cmb[:,1:ii+1] - damp = cmb[:,ii+1:] + freq = cmb[:,1:nrmodes+1] + damp = cmb[:,nrmodes+1:nrmodes*2+1] + real_eig = None + if cmb.shape[1] > nrmodes*2+1: + real_eig = cmb[:,nrmodes*2+1:] - return wind, freq, damp + return wind, freq, damp, real_eig def load_cmb_df(self, fname): # index name can be rotor speed or wind speed @@ -141,13 +149,15 @@ class results(object): oper_name = oper_name.replace(' ', '').replace('[', '_')[:-1] oper_name = oper_name.replace('/', '') - speed, freq, damp = self.load_cmb(fname) + speed, freq, damp, real_eig = self.load_cmb(fname) mods = freq.shape[1] ops = freq.shape[0] df = pd.DataFrame(columns=[oper_name, 'Fd_hz', 'damp_ratio', 'mode']) df['Fd_hz'] = freq.flatten() df['damp_ratio'] = damp.flatten() + if real_eig is not None: + df['real_eig'] = real_eig.flatten() # now each mode number is a row so that means that each operating # point is now repeated as many times as there are modes df[oper_name] = speed.repeat(mods) diff --git a/wetb/prepost/tests/test_hawcstab2.py b/wetb/prepost/tests/test_hawcstab2.py index 90d623e..675803b 100644 --- a/wetb/prepost/tests/test_hawcstab2.py +++ b/wetb/prepost/tests/test_hawcstab2.py @@ -31,13 +31,17 @@ class Tests(unittest.TestCase): def test_cmb_df(self): fname1 = os.path.join(os.path.dirname(__file__), 'data/campbell_diagram.cmb') - speed, freq, damp = results().load_cmb(fname1) + speed, freq, damp, real_eig = results().load_cmb(fname1) + + self.assertIsNone(real_eig) df = results().load_cmb_df(fname1) - #mods = freq.shape[1] + mods = freq.shape[1] ops = freq.shape[0] self.assertEqual(len(speed), ops) + self.assertEqual(ops, 22) + self.assertEqual(mods, 10) for k in range(ops): df_oper = df[df['wind_ms']==speed[k]] -- GitLab