def test_newmarkhall1982(): # Inputs PGVin = np.log(10) PSA10in = np.log(0.1) sd = 0.6 # NewmarkHall1982 PGVout, PGVsdout = NewmarkHall1982.psa102pgv(PSA10in, sd) mfact = NewmarkHall1982.getConversionFactor() lnsig = NewmarkHall1982.getLnSigma() assert abs(PGVout - np.log(9.46658)) < 0.001 assert abs(PGVsdout - 0.790489) < 0.001 assert abs(mfact - 94.6658) < 0.001 assert abs(lnsig - 0.5146578) < 0.001
def get_mean_and_stddevs(self, sites, rup, dists, imt, stddev_types): """ See superclass `method <http://docs.openquake.org/oq-hazardlib/master/gsim/index.html#openquake.hazardlib.gsim.base.GroundShakingIntensityModel.get_mean_and_stddevs>`__. """ # These are arrays to hold the weighted combination of the GMPEs lnmu = np.zeros_like(sites.vs30) stddev_types = self.DEFINED_FOR_STANDARD_DEVIATION_TYPES lnsd2 = [np.zeros_like(sites.vs30) for a in stddev_types] for i in range(len(self.GMPEs)): #--------------------------------------------------------------- # Loop over GMPE list #--------------------------------------------------------------- gmpe = self.GMPEs[i] #--------------------------------------------------------------- # Need to select the appropriate z1pt0 value for different GMPEs. # Note that these are required site parameters, so even though # OQ has these equations built into the class, the arrays must # be provided in the sites context. It might be worth sending # a request to OQ to provide a subclass that that computes the # depth parameters when not provided (as is done for BSSA14 but # not the others). #--------------------------------------------------------------- if gmpe == 'AbrahamsonEtAl2014()': sites.z1pt0 = sites.z1pt0ask14 if gmpe == 'BooreEtAl2014()' or gmpe == 'ChiouYoungs2014()': sites.z1pt0 = sites.z1pt0cy14 #--------------------------------------------------------------- # Evaluate GMPEs #--------------------------------------------------------------- gmpe_imts = [imt.__name__ for imt in \ gmpe.DEFINED_FOR_INTENSITY_MEASURE_TYPES] if (isinstance(imt, PGV)) and ("PGV" not in gmpe_imts): # If IMT is PGV and not given by GMPE, convert from PSA10 psa10, psa10sd = gmpe.get_mean_and_stddevs( sites, rup, dists, SA(1.0), stddev_types) lmean, lsd = NewmarkHall1982.psa102pgv(psa10, psa10sd[0]) else: lmean, lsd = gmpe.get_mean_and_stddevs( sites, rup, dists, imt, stddev_types) #--------------------------------------------------------------- # Convertions due to component definition #--------------------------------------------------------------- imc_in = gmpe.DEFINED_FOR_INTENSITY_MEASURE_COMPONENT imc_out = self.DEFINED_FOR_INTENSITY_MEASURE_COMPONENT lmean = BeyerBommer2006.ampIMCtoIMC(lmean, imc_in, imc_out, imt) for j in range(len(lnsd2)): lsd[j] = BeyerBommer2006.sigmaIMCtoIMC( lsd[j], imc_in, imc_out, imt) #--------------------------------------------------------------- # Compute weighted mean and sd #--------------------------------------------------------------- lnmu = lnmu + self.weights[i] * lmean # Note: the lnsd2 calculation isn't complete until we drop out of # this loop and substract lnmu**2 for j in range(len(lnsd2)): lnsd2[j] = lnsd2[j] + self.weights[i] * (lmean**2 + lsd[j]**2) for j in range(len(lnsd2)): lnsd2[j] = lnsd2[j] - lnmu**2 lnsd = [np.sqrt(a) for a in lnsd2] return lnmu, lnsd
def get_mean_and_stddevs(self, sites, rup, dists, imt, stddev_types): """ See superclass `method <http://docs.openquake.org/oq-hazardlib/master/gsim/index.html#openquake.hazardlib.gsim.base.GroundShakingIntensityModel.get_mean_and_stddevs>`__. """ # These are arrays to hold the weighted combination of the GMPEs lnmu = np.zeros_like(sites.vs30) stddev_types = self.DEFINED_FOR_STANDARD_DEVIATION_TYPES lnsd2 = [np.zeros_like(sites.vs30) for a in stddev_types] for i in range(len(self.GMPEs)): #--------------------------------------------------------------- # Loop over GMPE list #--------------------------------------------------------------- gmpe = self.GMPEs[i] #--------------------------------------------------------------- # Need to select the appropriate z1pt0 value for different GMPEs. # Note that these are required site parameters, so even though # OQ has these equations built into the class, the arrays must # be provided in the sites context. It might be worth sending # a request to OQ to provide a subclass that that computes the # depth parameters when not provided (as is done for BSSA14 but # not the others). #--------------------------------------------------------------- if gmpe == 'AbrahamsonEtAl2014()': sites.z1pt0 = sites.z1pt0ask14 if gmpe == 'BooreEtAl2014()' or gmpe == 'ChiouYoungs2014()': sites.z1pt0 = sites.z1pt0cy14 #--------------------------------------------------------------- # Evaluate GMPEs #--------------------------------------------------------------- gmpe_imts = [imt.__name__ for imt in \ gmpe.DEFINED_FOR_INTENSITY_MEASURE_TYPES] if (isinstance(imt, PGV)) and ("PGV" not in gmpe_imts): # If IMT is PGV and not given by GMPE, convert from PSA10 psa10, psa10sd = gmpe.get_mean_and_stddevs( sites, rup, dists, SA(1.0), stddev_types) lmean, lsd = NewmarkHall1982.psa102pgv(psa10, psa10sd[0]) else: lmean, lsd = gmpe.get_mean_and_stddevs(sites, rup, dists, imt, stddev_types) #--------------------------------------------------------------- # Convertions due to component definition #--------------------------------------------------------------- imc_in = gmpe.DEFINED_FOR_INTENSITY_MEASURE_COMPONENT imc_out = self.DEFINED_FOR_INTENSITY_MEASURE_COMPONENT lmean = BeyerBommer2006.ampIMCtoIMC(lmean, imc_in, imc_out, imt) for j in range(len(lnsd2)): lsd[j] = BeyerBommer2006.sigmaIMCtoIMC(lsd[j], imc_in, imc_out, imt) #--------------------------------------------------------------- # Compute weighted mean and sd #--------------------------------------------------------------- lnmu = lnmu + self.weights[i] * lmean # Note: the lnsd2 calculation isn't complete until we drop out of # this loop and substract lnmu**2 for j in range(len(lnsd2)): lnsd2[j] = lnsd2[j] + self.weights[i] * (lmean**2 + lsd[j]**2) for j in range(len(lnsd2)): lnsd2[j] = lnsd2[j] - lnmu**2 lnsd = [np.sqrt(a) for a in lnsd2] return lnmu, lnsd
def get_mean_and_stddevs(self, sites, rup, dists, imt, stddev_types): """ See superclass `method <http://docs.openquake.org/oq-hazardlib/master/gsim/index.html#openquake.hazardlib.gsim.base.GroundShakingIntensityModel.get_mean_and_stddevs>`__. """ #----------------------------------------------------------------------- # Sort out shapes of sites and dists elements #----------------------------------------------------------------------- shapes = [] for k, v in sites.__dict__.items(): if (k is not 'lons') and (k is not 'lats'): shapes.append(v.shape) for k, v in dists.__dict__.items(): if (k is not 'lons') and (k is not 'lats'): shapes.append(v.shape) shapeset = set(shapes) if len(shapeset) != 1: raise Exception('All sites and dists elements must have same shape.') else: orig_shape = list(shapeset)[0] # Need to turn all 2D arrays into 1D arrays because of # inconsistencies in how arrays are handled in OpenQuake. for k, v in dists.__dict__.items(): if (k is not 'lons') and (k is not 'lats'): dists.__dict__[k] = np.reshape(dists.__dict__[k], (-1,)) for k, v in sites.__dict__.items(): if (k is not 'lons') and (k is not 'lats'): sites.__dict__[k] = np.reshape(sites.__dict__[k], (-1,)) #----------------------------------------------------------------------- # These are arrays to hold the weighted combination of the GMPEs #----------------------------------------------------------------------- lnmu = np.zeros_like(sites.vs30) sd_avail = self.DEFINED_FOR_STANDARD_DEVIATION_TYPES if not sd_avail.issuperset(set(stddev_types)): raise Exception("Requested an unavailable stddev_type.") lnsd2 = [np.zeros_like(sites.vs30) for a in stddev_types] for i in range(len(self.GMPES)): #------------------------------------------------------------------- # Loop over GMPE list #------------------------------------------------------------------- gmpe = self.GMPES[i] sites = MultiGMPE.set_sites_depth_parameters(sites, gmpe) #------------------------------------------------------------------- # Evaluate GMPEs #------------------------------------------------------------------- gmpe_imts = [imt.__name__ for imt in \ gmpe.DEFINED_FOR_INTENSITY_MEASURE_TYPES] if (isinstance(imt, PGV)) and ("PGV" not in gmpe_imts): #--------------------------------------------------------------- # If IMT is PGV and PGV is not given by the GMPE, then # convert from PSA10. #--------------------------------------------------------------- if self.HAS_SITE[i] is True: psa10, psa10sd = gmpe.get_mean_and_stddevs( sites, rup, dists, SA(1.0), stddev_types) else: lamps = self.get_site_factors( sites, rup, dists, SA(1.0), default = True) psa10, psa10sd = gmpe.get_mean_and_stddevs( sites, rup, dists, SA(1.0), stddev_types) psa10 = psa10 + lamps lmean, lsd = NewmarkHall1982.psa102pgv(psa10, psa10sd[0]) else: if self.HAS_SITE[i] is True: lmean, lsd = gmpe.get_mean_and_stddevs( sites, rup, dists, imt, stddev_types) else: lamps = self.get_site_factors( sites, rup, dists, imt, default = True) lmean, lsd = gmpe.get_mean_and_stddevs( sites, rup, dists, imt, stddev_types) lmean = lmean + lamps #------------------------------------------------------------------- # Convertions due to component definition #------------------------------------------------------------------- imc_in = gmpe.DEFINED_FOR_INTENSITY_MEASURE_COMPONENT imc_out = self.DEFINED_FOR_INTENSITY_MEASURE_COMPONENT lmean = BeyerBommer2006.ampIMCtoIMC(lmean, imc_in, imc_out, imt) for j in range(len(lnsd2)): lsd[j] = BeyerBommer2006.sigmaIMCtoIMC( lsd[j], imc_in, imc_out, imt) #------------------------------------------------------------------- # Compute weighted mean and sd #------------------------------------------------------------------- lnmu = lnmu + self.WEIGHTS[i] * lmean # Note: the lnsd2 calculation isn't complete until we drop out of # this loop and substract lnmu**2 for j in range(len(lnsd2)): lnsd2[j] = lnsd2[j] + self.WEIGHTS[i] * (lmean**2 + lsd[j]**2) for j in range(len(lnsd2)): lnsd2[j] = lnsd2[j] - lnmu**2 lnsd = [np.sqrt(a) for a in lnsd2] # Undo reshapes of inputs for k, v in dists.__dict__.items(): if (k is not 'lons') and (k is not 'lats'): dists.__dict__[k] = np.reshape(dists.__dict__[k], orig_shape) for k, v in sites.__dict__.items(): if (k is not 'lons') and (k is not 'lats'): sites.__dict__[k] = np.reshape(sites.__dict__[k], orig_shape) # Reshape output lnmu = np.reshape(lnmu, orig_shape) for i in range(len(lnsd)): lnsd[i] = np.reshape(lnsd[i], orig_shape) return lnmu, lnsd