diff --git a/wetb/fatigue_tools/fatigue.py b/wetb/fatigue_tools/fatigue.py index 4b4009b6cd58f6669c97bc6c11462c6f480ead9d..4be58383bd9b6018c5fb65f478f72eb9d93f1b8e 100644 --- a/wetb/fatigue_tools/fatigue.py +++ b/wetb/fatigue_tools/fatigue.py @@ -106,7 +106,7 @@ def eq_load_and_cycles(signals, no_bins=46, m=[3, 4, 6, 8, 10, 12], neq=[10 ** 6 ampl_bin_mean = (ampl_bin_edges[:-1] + ampl_bin_edges[1:]) / 2 cycles, ampl_bin_mean = cycles.flatten(), ampl_bin_mean.flatten() with warnings.catch_warnings(): - warnings.simplefilter("ignore") + warnings.simplefilter("ignore") eq_loads = [[((np.nansum(cycles * ampl_bin_mean ** _m) / _neq) ** (1. / _m)) for _m in np.atleast_1d(m)] for _neq in np.atleast_1d(neq)] return eq_loads, cycles, ampl_bin_mean, ampl_bin_edges @@ -160,7 +160,7 @@ def cycle_matrix(signals, ampl_bins=10, mean_bins=10, rainflow_func=rainflow_win 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) with warnings.catch_warnings(): - warnings.simplefilter("ignore") + warnings.simplefilter("ignore") ampl_bin_sum = np.histogram2d(ampls, means, [ampl_bins, mean_bins], weights=weights * ampls)[0] ampl_bin_mean = np.nanmean(ampl_bin_sum / np.where(cycles,cycles,np.nan),1) mean_bin_sum = np.histogram2d(ampls, means, [ampl_bins, mean_bins], weights=weights * means)[0] @@ -169,6 +169,51 @@ def cycle_matrix(signals, ampl_bins=10, mean_bins=10, rainflow_func=rainflow_win return cycles, ampl_bin_mean, ampl_edges, mean_bin_mean, mean_edges +def cycle_matrix2(signal, nrb_amp, nrb_mean, rainflow_func=rainflow_windap): + """ + Same as wetb.fatigue_tools.fatigue.cycle_matrix but bin from min_amp to + max_amp instead of 0 to max_amp. + + Parameters + ---------- + + Signal : ndarray(n) + 1D Raw signal array + + nrb_amp : int + Number of bins for the amplitudes + + nrb_mean : int + Number of bins for the means + + rainflow_func : {rainflow_windap, rainflow_astm}, optional + The rainflow counting function to use (default is rainflow_windap) + + Returns + ------- + + cycles : ndarray, shape(ampl_bins, mean_bins) + A bi-dimensional histogram of load cycles(full cycles). Amplitudes are\ + histogrammed along the first dimension and mean values are histogrammed + along the second dimension. + + ampl_edges : ndarray, shape(no_bins+1,n) + The amplitude bin edges + + mean_edges : ndarray, shape(no_bins+1,n) + The mean bin edges + + """ + bins = [nrb_amp, nrb_mean] + ampls, means = rainflow_func(signal) + weights = np.ones_like(ampls) + cycles, ampl_edges, mean_edges = np.histogram2d(ampls, means, bins, + weights=weights) + cycles = cycles / 2 # to get full cycles + + return cycles, ampl_edges, mean_edges + + if __name__ == "__main__": signal1 = np.array([-2.0, 0.0, 1.0, 0.0, -3.0, 0.0, 5.0, 0.0, -1.0, 0.0, 3.0, 0.0, -4.0, 0.0, 4.0, 0.0, -2.0]) signal2 = signal1 * 1.1