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