diff --git a/wetb/fatigue_tools/fatigue.py b/wetb/fatigue_tools/fatigue.py index bde2d087b59a418c8fa6040f5a3c126e9330277b..27b4c2c60d78ec0dce431704b7e1ff179632abf4 100644 --- a/wetb/fatigue_tools/fatigue.py +++ b/wetb/fatigue_tools/fatigue.py @@ -116,8 +116,8 @@ def cycle_matrix(signals, ampl_bins=10, mean_bins=10, rainflow_func=rainflow_win Parameters ---------- Signals : array-like or list of tuples - if array-like, the raw signal - if list of tuples, list of (weight, signal), e.g. [(0.1,sig1), (0.8,sig2), (.1,sig3)] + - if array-like, the raw signal\n + - if list of tuples, list of (weight, signal), e.g. [(0.1,sig1), (0.8,sig2), (.1,sig3)]\n ampl_bins : int or array-like, optional if int, Number of amplitude value bins (default is 10) if array-like, the bin edges for amplitude @@ -149,19 +149,12 @@ def cycle_matrix(signals, ampl_bins=10, mean_bins=10, rainflow_func=rainflow_win """ if isinstance(signals[0], tuple): - ampls = np.empty((0,), dtype=np.float64) - means = np.empty((0,), dtype=np.float64) - weights = np.empty((0,), dtype=np.float64) - for w, signal in signals: - a, m = rainflow_func(signal[:]) - ampls = np.r_[ampls, a] - means = np.r_[means, m] - weights = np.r_[weights, (np.zeros_like(a) + w)] + weights, ampls, means = np.array([(np.zeros_like(ampl)+weight,ampl,mean) for weight, signal in signals for ampl,mean in rainflow_func(signal[:]).T], dtype=np.float64).T else: ampls, means = rainflow_func(signals[:]) weights = np.ones_like(ampls) if isinstance(ampl_bins, int): - ampl_bins = np.linspace(0, 1, num=ampl_bins + 1) * ampls.max() + ampl_bins = np.linspace(0, 1, num=ampl_bins + 1) * ampls[weights>0].max() cycles, ampl_edges, mean_edges = np.histogram2d(ampls, means, [ampl_bins, mean_bins], weights=weights) ampl_bin_sum = np.histogram2d(ampls, means, [ampl_bins, mean_bins], weights=weights * ampls)[0] @@ -169,7 +162,7 @@ def cycle_matrix(signals, ampl_bins=10, mean_bins=10, rainflow_func=rainflow_win mask = (cycles > 0) ampl_bin_mean[mask] = ampl_bin_sum[mask] / cycles[mask] mean_bin_sum = np.histogram2d(ampls, means, [ampl_bins, mean_bins], weights=weights * means)[0] - mean_bin_mean = np.zeros_like(cycles) + mean_bin_mean = np.zeros_like(cycles)+np.nan mean_bin_mean[cycles > 0] = mean_bin_sum[cycles > 0] / cycles[cycles > 0] cycles = cycles / 2 # to get full cycles return cycles, ampl_bin_mean, ampl_edges, mean_bin_mean, mean_edges diff --git a/wetb/fatigue_tools/tests/test_fatigue.py b/wetb/fatigue_tools/tests/test_fatigue.py index 93dd8ceb38038dbca96a520afd08250985d47331..0ef2fef2e7c85b38b02b63123e48067c30832df5 100644 --- a/wetb/fatigue_tools/tests/test_fatigue.py +++ b/wetb/fatigue_tools/tests/test_fatigue.py @@ -73,6 +73,13 @@ class TestFatigueTools(unittest.TestCase): [ 0., 1., 4., 0.], [ 0., 0., 0., 0.], [ 0., 1., 2., 0.]]) / 2, 0.001) + + def test_astm_weighted(self): + data = Hawc2io.ReadHawc2(testfilepath + "test").ReadBinary([2]).flatten() + np.testing.assert_allclose(cycle_matrix([(1, data),(1,data)], 4, 4, rainflow_func=rainflow_astm)[0], np.array([[ 24., 83., 53., 26.], + [ 0., 1., 4., 0.], + [ 0., 0., 0., 0.], + [ 0., 1., 2., 0.]]) , 0.001) if __name__ == "__main__": #import sys;sys.argv = ['', 'Test.testName']