def test_with_intra_and_inter(self): mean = 10 inter = 2 intra = 3 sites = SiteCollection([Site(Point(0, 0), mean, False, inter, intra)]) self.gsim.expect_same_sitecol = False numpy.random.seed(37) cormo = JB2009CorrelationModel(vs30_clustering=False) distribution = scipy.stats.norm() eps_intra = distribution.rvs(size=(1, 1)) eps_intra = numpy.array( cormo.apply_correlation(sites, self.imt1, eps_intra))[0] eps_inter = distribution.rvs(size=(1, 1)) gmf = ground_motion_field_with_residuals( self.rupture, sites, self.imt1, self.gsim, truncation_level=None, intra_residual_epsilons=eps_intra, inter_residual_epsilons=eps_inter ) numpy.testing.assert_array_almost_equal(gmf, 11.1852253)
def test_total_stddev_only(self): truncation_level = None numpy.random.seed(37) distribution = scipy.stats.norm() epsilons = distribution.rvs(size=len(self.sites_total)) intensity = ground_motion_field_with_residuals( self.rupture, self.sites_total, self.imt2, self.total_stddev_gsim, truncation_level, total_residual_epsilons=epsilons) assert_allclose((intensity[0].mean(), intensity[0].std()), [8.2101853, 3.4256517], rtol=4e-2) assert_allclose((intensity[1].mean(), intensity[1].std()), [9.05092648, 4.3603691], rtol=4e-2) assert_allclose((intensity[2].mean(), intensity[2].std()), [8.14012353, 3.3886777], rtol=4e-2) assert_allclose((intensity[3].mean(), intensity[3].std()), [11.50308827, 9.22499337], rtol=4e-2) assert_allclose((intensity[4].mean(), intensity[4].std()), [11.50308827, 9.22499337], rtol=4e-2) assert_allclose((intensity[5].mean(), intensity[5].std()), [8.07006177, 3.35942342], rtol=4e-2) assert_allclose((intensity[6].mean(), intensity[6].std()), [8.07006177, 3.35942342], rtol=4e-2)
def test_with_intra_and_inter(self): mean = 10 inter = 2 intra = 3 sites = SiteCollection([Site(Point(0, 0), mean, False, inter, intra)]) self.gsim.expect_same_sitecol = False numpy.random.seed(37) cormo = JB2009CorrelationModel(vs30_clustering=False) distribution = scipy.stats.norm() eps_intra = distribution.rvs(size=(1, 1)) eps_intra = numpy.array( cormo.apply_correlation(sites, self.imt1, eps_intra))[0] eps_inter = distribution.rvs(size=(1, 1)) gmf = ground_motion_field_with_residuals( self.rupture, sites, self.imt1, self.gsim, truncation_level=None, intra_residual_epsilons=eps_intra, inter_residual_epsilons=eps_inter) numpy.testing.assert_array_almost_equal(gmf, 11.1852253)
def test_zero_truncation(self): truncation_level = 0 self.gsim.expect_stddevs = False intensity = ground_motion_field_with_residuals( self.rupture, self.sites, self.imt1, self.gsim, truncation_level) for i in xrange(7): self.assertEqual(intensity[i].std(), 0) self.assertEqual(intensity[0].mean(), self.mean1) self.assertEqual(intensity[1].mean(), self.mean2) self.assertEqual(intensity[2].mean(), self.mean3) self.assertEqual(intensity[3].mean(), self.mean4567) self.assertEqual(intensity[4].mean(), self.mean4567) self.assertEqual(intensity[5].mean(), self.mean4567) self.assertEqual(intensity[6].mean(), self.mean4567)
def test_zero_truncation(self): truncation_level = 0 self.gsim.expect_stddevs = False intensity = ground_motion_field_with_residuals(self.rupture, self.sites, self.imt1, self.gsim, truncation_level) for i in xrange(7): self.assertEqual(intensity[i].std(), 0) self.assertEqual(intensity[0].mean(), self.mean1) self.assertEqual(intensity[1].mean(), self.mean2) self.assertEqual(intensity[2].mean(), self.mean3) self.assertEqual(intensity[3].mean(), self.mean4567) self.assertEqual(intensity[4].mean(), self.mean4567) self.assertEqual(intensity[5].mean(), self.mean4567) self.assertEqual(intensity[6].mean(), self.mean4567)
def compute(self, ruptures, rupture_seeds, rupture_ids, maximum_distance): """ Compute ground motion values radiated from `ruptures`. :param ruptures: an iterator over N :class:`openquake.hazardlib.source.rupture.Rupture` instances :param rupture_seeds: an interator over N integer values to be used to initialize the RNG :param rupture_ids: an iterator over N integer values. Each of them uniquely identifies the corresponding `rupture` :param float maximum_distance: the maximum distance threshold used to filter the sites to be considered for each rupture :returns: a tuple with two elements. The first one is a list of A numpy array. Each of them contains the ground motion values associated with an asset. The second element contains the list of A assets considered. """ all_gmvs = [] all_assets = [] site_gmv = collections.defaultdict(dict) performance_dict = collections.Counter() for rupture, rupture_seed, rupture_id in itertools.izip( ruptures, rupture_seeds, rupture_ids): gsim, tstddev = self.gsim(rupture) with LightMonitor(performance_dict, 'filtering sites'): sites_of_interest, mask = self.sites_of_interest( rupture, maximum_distance) if not sites_of_interest: continue with LightMonitor(performance_dict, 'generating epsilons'): (total, inter, intra) = self.epsilons(rupture_seed, mask, tstddev) with LightMonitor(performance_dict, 'compute ground motion fields'): gmf = ground_motion_field_with_residuals( rupture, sites_of_interest, self.imt, gsim, self.truncation_level, total_residual_epsilons=total, intra_residual_epsilons=intra, inter_residual_epsilons=inter) with LightMonitor(performance_dict, 'collecting gmvs'): for site, gmv in itertools.izip(sites_of_interest, gmf): site_gmv[site.id][rupture_id] = gmv logs.LOG.debug('Disaggregation of the time spent in the loop %s' % (performance_dict)) for site_id, assets in self.sites_assets: n_assets = len(assets) if site_id in site_gmv: gmvs = [site_gmv[site_id].get(r, 0) for r in rupture_ids] else: gmvs = numpy.zeros(len(rupture_ids)) del site_gmv[site_id] all_gmvs.extend([gmvs] * n_assets) all_assets.extend(assets) return all_assets, all_gmvs
def compute(self, ruptures, rupture_seeds, rupture_ids, maximum_distance): """ Compute ground motion values radiated from `ruptures`. :param ruptures: an iterator over N :class:`openquake.hazardlib.source.rupture.Rupture` instances :param rupture_seeds: an interator over N integer values to be used to initialize the RNG :param rupture_ids: an iterator over N integer values. Each of them uniquely identifies the corresponding `rupture` :param float maximum_distance: the maximum distance threshold used to filter the sites to be considered for each rupture :returns: a tuple with two elements. The first one is a list of A numpy array. Each of them contains the ground motion values associated with an asset. The second element contains the list of A assets considered. """ all_gmvs = [] all_assets = [] site_gmv = collections.defaultdict(dict) performance_dict = collections.Counter() for rupture, rupture_seed, rupture_id in itertools.izip( ruptures, rupture_seeds, rupture_ids): gsim, tstddev = self.gsim(rupture) with LightMonitor(performance_dict, 'filtering sites'): sites_of_interest, mask = self.sites_of_interest( rupture, maximum_distance) if not sites_of_interest: continue with LightMonitor(performance_dict, 'generating epsilons'): (total, inter, intra) = self.epsilons( rupture_seed, mask, tstddev) with LightMonitor(performance_dict, 'compute ground motion fields'): gmf = ground_motion_field_with_residuals( rupture, sites_of_interest, self.imt, gsim, self.truncation_level, total_residual_epsilons=total, intra_residual_epsilons=intra, inter_residual_epsilons=inter) with LightMonitor(performance_dict, 'collecting gmvs'): for site, gmv in itertools.izip(sites_of_interest, gmf): site_gmv[site.id][rupture_id] = gmv logs.LOG.debug('Disaggregation of the time spent in the loop %s' % ( performance_dict)) for site_id, assets in self.sites_assets: n_assets = len(assets) if site_id in site_gmv: gmvs = [site_gmv[site_id].get(r, 0) for r in rupture_ids] else: gmvs = numpy.zeros(len(rupture_ids)) del site_gmv[site_id] all_gmvs.extend([gmvs] * n_assets) all_assets.extend(assets) return all_assets, all_gmvs