def gmrotdpp_withPG(acceleration_x, time_step_x, acceleration_y, time_step_y, periods, percentile, damping=0.05, units="cm/s/s", method="Nigam-Jennings"): """ modified from gmrotdpp to also return gmrotdpp(PGA, PGV and PGD) This is much faster than gmrotdpp_slow """ from smtk.intensity_measures import get_response_spectrum, equalise_series, rotate_horizontal if (percentile > 100. + 1E-9) or (percentile < 0.): raise ValueError("Percentile for GMRotDpp must be between 0. and 100.") # Get the time-series corresponding to the SDOF sax, _, x_a, _, _ = get_response_spectrum(acceleration_x, time_step_x, periods, damping, units, method) say, _, y_a, _, _ = get_response_spectrum(acceleration_y, time_step_y, periods, damping, units, method) x_a, y_a = equalise_series(x_a, y_a) #TU: this is the part I m adding #compute vel and disp from acceleration and #add to the spectral acceleration time series from scipy.integrate import cumtrapz velocity_x = time_step_x * cumtrapz(acceleration_x[0:-1], initial=0.) displacement_x = time_step_x * cumtrapz(velocity_x, initial=0.) x_a = np.column_stack( (acceleration_x[0:-1], velocity_x, displacement_x, x_a)) velocity_y = time_step_y * cumtrapz(acceleration_y[0:-1], initial=0.) displacement_y = time_step_y * cumtrapz(velocity_y, initial=0.) y_a = np.column_stack( (acceleration_y[0:-1], velocity_y, displacement_y, y_a)) angles = np.arange(0., 90., 1.) max_a_theta = np.zeros([len(angles), len(periods) + 3], dtype=float) max_a_theta[0, :] = np.sqrt( np.max(np.fabs(x_a), axis=0) * np.max(np.fabs(y_a), axis=0)) for iloc, theta in enumerate(angles): if iloc == 0: max_a_theta[iloc, :] = np.sqrt( np.max(np.fabs(x_a), axis=0) * np.max(np.fabs(y_a), axis=0)) else: rot_x, rot_y = rotate_horizontal(x_a, y_a, theta) max_a_theta[iloc, :] = np.sqrt( np.max(np.fabs(rot_x), axis=0) * np.max(np.fabs(rot_y), axis=0)) gmrotd = np.percentile(max_a_theta, percentile, axis=0) return { "PGA": gmrotd[0], "PGV": gmrotd[1], "PGD": gmrotd[2], "Acceleration": gmrotd[3:] }
def test_spectrum_intensities(self): # Tests Housner Intensity and Acceleration Spectrum Intensity x_record = self.fle["INPUTS/RECORD1/XRECORD"][:] x_timestep = self.fle["INPUTS/RECORD1/XRECORD"].attrs["timestep"] sax = ims.get_response_spectrum(x_record, x_timestep, self.periods)[0] housner = ims.get_response_spectrum_intensity(sax) self.assertAlmostEqual(housner, 121.3103787, 3) asi = ims.get_acceleration_spectrum_intensity(sax) self.assertAlmostEqual(asi, 432.5134666, 3)
def test_spectrum_intensities(self): # Tests Housner Intensity and Acceleration Spectrum Intensity x_record = self.fle["INPUTS/RECORD1/XRECORD"][:] x_timestep = self.fle["INPUTS/RECORD1/XRECORD"].attrs["timestep"] sax = ims.get_response_spectrum(x_record, x_timestep, self.periods)[0] housner = ims.get_response_spectrum_intensity(sax) # Replace self.assertAlmostEqual(housner, 121.3103787, places=3) # which fails (and it shouldn't, probably due to rounding) for # housner=121.31095037062987 (0.0005716706298670715 difference) # with: self.assertAlmostEqual(housner, 121.3103787, delta=0.001) asi = ims.get_acceleration_spectrum_intensity(sax) self.assertAlmostEqual(asi, 432.5134666, 3)