예제 #1
0
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:]
    }
예제 #2
0
 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)
     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)