Exemple #1
0
 def test_magnitude_bins(self):
     """ Testing build disaggregation matrix """
     fname = os.path.join(DATA_PATH, 'data', 'ssm.xml')
     converter = sourceconverter.SourceConverter(50., 1., 10, 0.1, 10)
     groups = to_python(fname, converter)
     sources = []
     for g in groups:
         sources += g.sources
     site = Site(Point(172.63, -43.53),
                 vs30=250,
                 vs30measured=False,
                 z1pt0=330)
     imt = SA(3.0)
     iml = 0.25612220
     gsim_by_trt = {TRT.ACTIVE_SHALLOW_CRUST: Bradley2013()}
     truncation_level = 3.0
     n_epsilons = 1
     mag_bin_width = 0.1
     dist_bin_width = 100.
     coord_bin_width = 100.
     # Compute the disaggregation matrix
     edges, mtx = disagg.disaggregation(sources, site, imt, iml,
                                        gsim_by_trt, truncation_level,
                                        n_epsilons, mag_bin_width,
                                        dist_bin_width, coord_bin_width)
     tm = disagg.mag_pmf(mtx[:, :, :, :, :, 0])
     numpy.testing.assert_array_less(numpy.zeros_like(tm[2:]), tm[2:])
Exemple #2
0
 def test(self):
     # a test sensitive to gsim.minimum_distance
     bin_edges, matrix = disagg.disaggregation(self.sources,
                                               self.site,
                                               self.imt,
                                               self.iml,
                                               self.gsims,
                                               self.truncation_level,
                                               n_epsilons=3,
                                               mag_bin_width=3,
                                               dist_bin_width=4,
                                               coord_bin_width=2.4)
     mag_bins, dist_bins, lon_bins, lat_bins, eps_bins, trt_bins = bin_edges
     aaae = numpy.testing.assert_array_almost_equal
     aaae(mag_bins, [3, 6, 9])
     aaae(dist_bins, [
         4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60, 64, 68,
         72, 76, 80, 84, 88, 92, 96, 100, 104, 108, 112
     ])
     aaae(lon_bins, [-0.904195, 0.1, 1.104195])
     aaae(lat_bins, [-0.904194, 0.1, 1.104194])
     aaae(eps_bins, [-1, -0.3333333, 0.3333333, 1])
     self.assertEqual(trt_bins, [self.trt])
     aaae(matrix.shape, (2, 27, 2, 2, 3, 1))
     aaae(matrix.sum(), 6.14179818e-11)
    def test(self):
        self.gsim.truncation_level = self.truncation_level = 1
        bin_edges, matrix = disagg.disaggregation(
            self.sources, self.site, self.imt, self.iml, self.gsims,
            self.truncation_level, n_epsilons=3,
            mag_bin_width=3, dist_bin_width=4, coord_bin_width=2.4
        )
        mag_bins, dist_bins, lon_bins, lat_bins, eps_bins, trt_bins = bin_edges
        aaae = numpy.testing.assert_array_almost_equal
        aaae(mag_bins, [3, 6, 9])
        aaae(dist_bins, [0, 4, 8, 12, 16])
        aaae(lon_bins, [9.6, 12., 14.4, 16.8, 19.2, 21.6, 24.])
        aaae(lat_bins, [43.2, 45.6, 48.])
        aaae(eps_bins, [-1, -0.3333333, 0.3333333, 1])
        self.assertEqual(trt_bins, ['trt1', 'trt2'])
        for idx, value in [((0, 2, 4, 0, 0, 0), 0.0429088739427),
                           ((0, 2, 4, 0, 1, 0), 0.0915231841771),
                           ((0, 2, 4, 0, 2, 0), 0.0539109573863),
                           ((0, 2, 5, 0, 0, 0), 0.0524944739774),
                           ((0, 2, 5, 0, 1, 0), 0.0831147185105),
                           ((0, 2, 5, 0, 2, 0), 0.0553469961235),
                           ((0, 3, 5, 0, 1, 0), 0.0198247319211),
                           ((0, 3, 5, 0, 2, 0), 0.00040039738616),
                           ((1, 1, 0, 0, 1, 1), 0.00407387860215),
                           ((1, 1, 0, 0, 2, 1), 0.00163154735795),
                           ((1, 1, 0, 1, 0, 1), 0.00304128663811),
                           ((1, 1, 0, 1, 1, 1), 0.0151142198204),
                           ((1, 1, 0, 1, 2, 1), 0.00304128663811)]:
            self.assertAlmostEqual(matrix[idx], value)
            matrix[idx] = 0

        self.assertEqual(matrix.sum(), 0)
 def test_magnitude_bins(self):
     """ Testing build disaggregation matrix """
     fname = os.path.join(DATA_PATH, 'data', 'ssm.xml')
     converter = sourceconverter.SourceConverter(50., 1., 10, 0.1, 10)
     groups = to_python(fname, converter)
     sources = []
     for g in groups:
         sources += g.sources
     site = Site(Point(172.63, -43.53), vs30=250, vs30measured=False,
                 z1pt0=330)
     imt = SA(3.0)
     iml = 0.25612220
     gsim_by_trt = {TRT.ACTIVE_SHALLOW_CRUST: Bradley2013()}
     truncation_level = 3.0
     n_epsilons = 1
     mag_bin_width = 0.1
     dist_bin_width = 100.
     coord_bin_width = 100.
     # Compute the disaggregation matrix
     edges, mtx = disagg.disaggregation(sources, site, imt, iml,
                                        gsim_by_trt, truncation_level,
                                        n_epsilons, mag_bin_width,
                                        dist_bin_width, coord_bin_width)
     tm = disagg.mag_pmf(mtx[:, :, :, :, :, 0])
     numpy.testing.assert_array_less(numpy.zeros_like(tm[2:]), tm[2:])
Exemple #5
0
    def test_no_contributions_from_ruptures(self):
        # Test that the `disaggregation` function returns `None, None` if no
        # ruptures contribute to the hazard level.
        array = numpy.array
        float64 = numpy.float64
        int64 = numpy.int64
        # This is the result we get if the sources produce no ruptures:
        fake_bins_data = (
            array([], dtype=float64),
            array([], dtype=float64),
            array([], dtype=float64),
            array([], dtype=float64),
            array([], dtype=float64),
            array([], dtype=int64),
            [],
        )

        with mock.patch("openquake.hazardlib.calc.disagg._collect_bins_data") as cbd:
            with warnings.catch_warnings(record=True) as w:
                cbd.return_value = fake_bins_data

                self.gsim.truncation_level = self.truncation_level = 1
                bin_edges, matrix = disagg.disaggregation(
                    self.sources,
                    self.site,
                    self.imt,
                    self.iml,
                    self.gsims,
                    self.tom,
                    self.truncation_level,
                    n_epsilons=3,
                    mag_bin_width=3,
                    dist_bin_width=4,
                    coord_bin_width=2.4,
                )

                # We expect to get back 2 `None` values:
                self.assertIsNone(bin_edges)
                self.assertIsNone(matrix)

                # Also check for the warning that should be raised:
                expected_warning_msg = (
                    "No ruptures have contributed to the hazard at site "
                    "<Location=<Latitude=0.000000, Longitude=0.000000, "
                    "Depth=0.0000>, Vs30=2.0000, Vs30Measured=False, "
                    "Depth1.0km=4.0000, Depth2.5km=5.0000>"
                )
                self.assertEqual(1, len(w))
                [warning] = list(w)
                self.assertEqual(expected_warning_msg, warning.message.message)
    def test_cross_idl(self):
        # test disaggregation with source generating ruptures crossing
        # internation date line
        ruptures_and_poes = [
            ([0, 0.2, 0.3], self.FakeRupture(5.5, 0.04, 55, -179.5, 45.5)),
            ([0.4, 0.5, 0.6], self.FakeRupture(7.5, 0.03, 75, 179.5, 46.5)),
        ]
        source = self.FakeSource(1, [rupture for poes, rupture in ruptures_and_poes], self.tom, "trt1")

        disagreggated_poes = dict((rupture, poes) for (poes, rupture) in ruptures_and_poes)
        gsim = self.FakeGSIM(
            self.iml, self.imt, truncation_level=1, n_epsilons=3, disaggregated_poes=disagreggated_poes
        )

        bin_edges, matrix = disagg.disaggregation(
            [source],
            self.site,
            self.imt,
            self.iml,
            {"trt1": gsim},
            truncation_level=1,
            n_epsilons=3,
            mag_bin_width=1,
            dist_bin_width=10,
            coord_bin_width=1.0,
        )
        mag_bins, dist_bins, lon_bins, lat_bins, eps_bins, trt_bins = bin_edges
        aaae = numpy.testing.assert_array_almost_equal
        aaae(mag_bins, [5, 6, 7, 8])
        aaae(dist_bins, [50, 60, 70, 80])
        aaae(lon_bins, [179.0, -180, -179.0])
        aaae(lat_bins, [45.0, 46.0, 47.0])
        aaae(eps_bins, [-1, -0.3333333, 0.3333333, 1])
        self.assertEqual(trt_bins, ["trt1"])
        for idx, value in [
            ((0, 0, 1, 0, 0, 0), 0),
            ((0, 0, 1, 0, 1, 0), 0.008131160717433694),
            ((0, 0, 1, 0, 2, 0), 0.012171913957925717),
            ((2, 2, 0, 1, 0, 0), 0.012109762440985716),
            ((2, 2, 0, 1, 1, 0), 0.015114219820389518),
            ((2, 2, 0, 1, 2, 0), 0.01810953978371055),
        ]:
            self.assertAlmostEqual(matrix[idx], value)
            matrix[idx] = 0

        self.assertEqual(matrix.sum(), 0)
Exemple #7
0
    def test_cross_idl(self):
        # test disaggregation with source generating ruptures crossing
        # internation date line
        ruptures_and_poes = [
            ([0, 0.2, 0.3], self.FakeRupture(5.5, 0.04, 55, -179.5, 45.5)),
            ([0.4, 0.5, 0.6], self.FakeRupture(7.5, 0.03, 75, 179.5, 46.5))
        ]
        source = self.FakeSource(
            1, [rupture for poes, rupture in ruptures_and_poes], self.tom,
            'trt1')

        disagreggated_poes = dict(
            (rupture, poes) for (poes, rupture) in ruptures_and_poes)
        gsim = self.FakeGSIM(self.iml,
                             self.imt,
                             truncation_level=1,
                             n_epsilons=3,
                             disaggregated_poes=disagreggated_poes)

        bin_edges, matrix = disagg.disaggregation([source],
                                                  self.site,
                                                  self.imt,
                                                  self.iml, {'trt1': gsim},
                                                  truncation_level=1,
                                                  n_epsilons=3,
                                                  mag_bin_width=1,
                                                  dist_bin_width=10,
                                                  coord_bin_width=1.0)
        mag_bins, dist_bins, lon_bins, lat_bins, eps_bins, trt_bins = bin_edges
        aaae = numpy.testing.assert_array_almost_equal
        aaae(mag_bins, [5, 6, 7, 8])
        aaae(dist_bins, [50, 60, 70, 80])
        aaae(lon_bins, [179., -180, -179.])
        aaae(lat_bins, [45., 46., 47.])
        aaae(eps_bins, [-1, -0.3333333, 0.3333333, 1])
        self.assertEqual(trt_bins, ['trt1'])
        for idx, value in [((0, 0, 1, 0, 0, 0), 0),
                           ((0, 0, 1, 0, 1, 0), 0.008131160717433694),
                           ((0, 0, 1, 0, 2, 0), 0.012171913957925717),
                           ((2, 2, 0, 1, 0, 0), 0.012109762440985716),
                           ((2, 2, 0, 1, 1, 0), 0.015114219820389518),
                           ((2, 2, 0, 1, 2, 0), 0.01810953978371055)]:
            self.assertAlmostEqual(matrix[idx], value)
            matrix[idx] = 0

        self.assertEqual(matrix.sum(), 0)
 def test(self):
     bin_edges, matrix = disagg.disaggregation(
         self.sources, self.site, self.imt, self.iml, self.gsims,
         self.truncation_level, n_epsilons=3,
         mag_bin_width=3, dist_bin_width=4, coord_bin_width=2.4)
     mag_bins, dist_bins, lon_bins, lat_bins, eps_bins, trt_bins = bin_edges
     aaae = numpy.testing.assert_array_almost_equal
     aaae(mag_bins, [3, 6, 9])
     aaae(dist_bins, [8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48,
                      52, 56, 60, 64, 68, 72, 76, 80, 84, 88, 92, 96, 100,
                      104, 108, 112])
     aaae(lon_bins, [[0, 2.4]])
     aaae(lat_bins, [[0, 2.4]])
     aaae(eps_bins, [-1, -0.3333333, 0.3333333, 1])
     self.assertEqual(trt_bins, [self.trt])
     aaae(matrix.shape, (2, 26, 1, 1, 3, 1))
     aaae(matrix.sum(), 6.14179818e-11)
    def test(self):
        self.gsim.truncation_level = self.truncation_level = 1
        bin_edges, matrix = disagg.disaggregation(
            self.sources,
            self.site,
            self.imt,
            self.iml,
            self.gsims,
            self.truncation_level,
            n_epsilons=3,
            mag_bin_width=3,
            dist_bin_width=4,
            coord_bin_width=2.4,
        )
        mag_bins, dist_bins, lon_bins, lat_bins, eps_bins, trt_bins = bin_edges
        aaae = numpy.testing.assert_array_almost_equal
        aaae(mag_bins, [3, 6, 9])
        aaae(dist_bins, [0, 4, 8, 12, 16])
        aaae(lon_bins, [9.6, 12.0, 14.4, 16.8, 19.2, 21.6, 24.0])
        aaae(lat_bins, [43.2, 45.6, 48.0])
        aaae(eps_bins, [-1, -0.3333333, 0.3333333, 1])
        self.assertEqual(trt_bins, ["trt1", "trt2"])
        for idx, value in [
            ((0, 2, 5, 0, 0, 0), 0.022067231457071457),
            ((0, 2, 5, 0, 1, 0), 0.043647500209963),
            ((0, 2, 5, 0, 2, 0), 0.022067231457071457),
            ((0, 3, 5, 0, 1, 0), 0.01982473192105061),
            ((0, 3, 5, 0, 2, 0), 0.003409751870464106),
            ((0, 2, 4, 0, 0, 0), 0.04290887394265486),
            ((0, 2, 4, 0, 1, 0), 0.09152318417708383),
            ((0, 2, 4, 0, 2, 0), 0.0438902176307755),
            ((1, 3, 5, 0, 0, 0), 0.03111383880273666),
            ((1, 3, 5, 0, 1, 0), 0.041268484485817325),
            ((1, 3, 5, 0, 2, 0), 0.03111383880273666),
            ((1, 3, 4, 0, 2, 0), 0.010480741793785553),
            ((1, 1, 0, 0, 1, 1), 0.004073878602149361),
            ((1, 1, 0, 0, 2, 1), 0.0016315473579483486),
            ((1, 1, 0, 1, 0, 1), 0.003041286638106211),
            ((1, 1, 0, 1, 1, 1), 0.015114219820389518),
            ((1, 1, 0, 1, 2, 1), 0.003041286638106211),
        ]:
            self.assertAlmostEqual(matrix[idx], value)
            matrix[idx] = 0

        self.assertEqual(matrix.sum(), 0)
Exemple #10
0
    def test_no_contributions_from_ruptures(self):
        # Test that the `disaggregation` function returns `None, None` if no
        # ruptures contribute to the hazard level.
        array = numpy.array
        float64 = numpy.float64
        int64 = numpy.int64
        # This is the result we get if the sources produce no ruptures:
        fake_bins_data = (array([], dtype=float64), array([], dtype=float64),
                          array([], dtype=float64), array([], dtype=float64),
                          array([], dtype=float64), array([], dtype=int64), [])

        with mock.patch(
                'openquake.hazardlib.calc.disagg._collect_bins_data_old'
        ) as cbd:
            with warnings.catch_warnings(record=True) as w:
                cbd.return_value = fake_bins_data

                self.gsim.truncation_level = self.truncation_level = 1
                bin_edges, matrix = disagg.disaggregation(
                    self.sources,
                    self.site,
                    self.imt,
                    self.iml,
                    self.gsims,
                    self.truncation_level,
                    n_epsilons=3,
                    mag_bin_width=3,
                    dist_bin_width=4,
                    coord_bin_width=2.4,
                )

                # We expect to get back 2 `None` values:
                self.assertIsNone(bin_edges)
                self.assertIsNone(matrix)

                # Also check for the warning that should be raised:
                expected_warning_msg = (
                    'No ruptures have contributed to the hazard at site '
                    '<Location=<Latitude=0.000000, Longitude=0.000000, '
                    'Depth=0.0000>, Vs30=2.0000, Vs30Measured=False, '
                    'Depth1.0km=4.0000, Depth2.5km=5.0000, Backarc=False>')
                self.assertEqual(1, len(w))
                [warning] = list(w)
                self.assertEqual(expected_warning_msg, str(warning.message))
Exemple #11
0
    def test(self):
        self.gsim.truncation_level = self.truncation_level = 1
        bin_edges, matrix = disagg.disaggregation(
            self.sources,
            self.site,
            self.imt,
            self.iml,
            self.gsims,
            self.tom,
            self.truncation_level,
            n_epsilons=3,
            mag_bin_width=3,
            dist_bin_width=4,
            coord_bin_width=2.4,
        )
        mag_bins, dist_bins, lon_bins, lat_bins, eps_bins, trt_bins = bin_edges
        aaae = numpy.testing.assert_array_almost_equal
        aaae(mag_bins, [3, 6, 9])
        aaae(dist_bins, [0, 4, 8, 12, 16])
        aaae(lon_bins, [9.6, 12.0, 14.4, 16.8, 19.2, 21.6, 24.0])
        aaae(lat_bins, [43.2, 45.6, 48.0])
        aaae(eps_bins, [-1, -0.3333333, 0.3333333, 1])
        self.assertEqual(trt_bins, ["trt1", "trt2"])
        for idx, value in [
            ((0, 2, 4, 0, 0, 0), 0.0907580),
            ((0, 2, 4, 0, 1, 0), 0.1920692),
            ((0, 2, 4, 0, 2, 0), 0.1197794),
            ((0, 2, 5, 0, 0, 0), 0.1319157),
            ((0, 2, 5, 0, 1, 0), 0.2110651),
            ((0, 2, 5, 0, 2, 0), 0.1398306),
            ((0, 3, 5, 0, 1, 0), 0.0435322),
            ((0, 3, 5, 0, 2, 0), 0.0008706),
            ((1, 1, 0, 0, 1, 1), 0.0105533),
            ((1, 1, 0, 0, 2, 1), 0.0042213),
            ((1, 1, 0, 1, 0, 1), 0.0079149),
            ((1, 1, 0, 1, 1, 1), 0.0395747),
            ((1, 1, 0, 1, 2, 1), 0.0079149),
        ]:
            self.assertAlmostEqual(matrix[idx], value)
            matrix[idx] = 0

        self.assertEqual(matrix.sum(), 0)
Exemple #12
0
    def test_source_errors(self):
        # exercise the case where an error occurs while computing on a given
        # seismic source; in this case, we expect an error to be raised which
        # signals the id of the source in question
        fail_source = self.FailSource(self.source2.source_id,
                                      self.source2.ruptures,
                                      self.source2.tom,
                                      self.source2.tectonic_region_type)
        sources = iter([self.source1, fail_source])

        with self.assertRaises(ValueError) as ae:
            bin_edges, matrix = disagg.disaggregation(
                sources, self.site, self.imt, self.iml, self.gsims,
                self.truncation_level, n_epsilons=3,
                mag_bin_width=3, dist_bin_width=4, coord_bin_width=2.4
            )
        expected_error = (
            'An error occurred with source id=2. Error: Something bad happened'
        )
        self.assertEqual(expected_error, str(ae.exception))
    def test_source_errors(self):
        # exercise the case where an error occurs while computing on a given
        # seismic source; in this case, we expect an error to be raised which
        # signals the id of the source in question
        fail_source = self.FailSource(self.source2.source_id,
                                      self.source2.ruptures,
                                      self.source2.tom,
                                      self.source2.tectonic_region_type)
        sources = iter([self.source1, fail_source])

        with self.assertRaises(ValueError) as ae:
            bin_edges, matrix = disagg.disaggregation(
                sources, self.site, self.imt, self.iml, self.gsims,
                self.truncation_level, n_epsilons=3,
                mag_bin_width=3, dist_bin_width=4, coord_bin_width=2.4
            )
        expected_error = (
            'An error occurred with source id=2. Error: Something bad happened'
        )
        self.assertEqual(expected_error, ae.exception.message)
Exemple #14
0
    def test(self):
        self.gsim.truncation_level = self.truncation_level = 1
        bin_edges, matrix = disagg.disaggregation(self.sources,
                                                  self.site,
                                                  self.imt,
                                                  self.iml,
                                                  self.gsims,
                                                  self.truncation_level,
                                                  n_epsilons=3,
                                                  mag_bin_width=3,
                                                  dist_bin_width=4,
                                                  coord_bin_width=2.4)
        mag_bins, dist_bins, lon_bins, lat_bins, eps_bins, trt_bins = bin_edges
        aaae = numpy.testing.assert_array_almost_equal
        aaae(mag_bins, [3, 6, 9])
        aaae(dist_bins, [0, 4, 8, 12, 16])
        aaae(lon_bins, [9.6, 12., 14.4, 16.8, 19.2, 21.6, 24.])
        aaae(lat_bins, [43.2, 45.6, 48.])
        aaae(eps_bins, [-1, -0.3333333, 0.3333333, 1])
        self.assertEqual(trt_bins, ['trt1', 'trt2'])
        for idx, value in [((0, 2, 5, 0, 0, 0), 0.022067231457071457),
                           ((0, 2, 5, 0, 1, 0), 0.043647500209963),
                           ((0, 2, 5, 0, 2, 0), 0.022067231457071457),
                           ((0, 3, 5, 0, 1, 0), 0.01982473192105061),
                           ((0, 3, 5, 0, 2, 0), 0.003409751870464106),
                           ((0, 2, 4, 0, 0, 0), 0.04290887394265486),
                           ((0, 2, 4, 0, 1, 0), 0.09152318417708383),
                           ((0, 2, 4, 0, 2, 0), 0.0438902176307755),
                           ((1, 3, 5, 0, 0, 0), 0.03111383880273666),
                           ((1, 3, 5, 0, 1, 0), 0.041268484485817325),
                           ((1, 3, 5, 0, 2, 0), 0.03111383880273666),
                           ((1, 3, 4, 0, 2, 0), 0.010480741793785553),
                           ((1, 1, 0, 0, 1, 1), 0.004073878602149361),
                           ((1, 1, 0, 0, 2, 1), 0.0016315473579483486),
                           ((1, 1, 0, 1, 0, 1), 0.003041286638106211),
                           ((1, 1, 0, 1, 1, 1), 0.015114219820389518),
                           ((1, 1, 0, 1, 2, 1), 0.003041286638106211)]:
            self.assertAlmostEqual(matrix[idx], value)
            matrix[idx] = 0

        self.assertEqual(matrix.sum(), 0)
    def test_areasource(self):
        nodalplane = NodalPlane(strike=0.0, dip=90.0, rake=0.0)
        src = AreaSource(
            source_id='src_1',
            name='area source',
            tectonic_region_type='Active Shallow Crust',
            mfd=TruncatedGRMFD(a_val=3.5, b_val=1.0, min_mag=5.0,
                               max_mag=6.5, bin_width=0.1),
            nodal_plane_distribution=PMF([(1.0, nodalplane)]),
            hypocenter_distribution=PMF([(1.0, 5.0)]),
            upper_seismogenic_depth=0.0,
            lower_seismogenic_depth=10.0,
            magnitude_scaling_relationship = WC1994(),
            rupture_aspect_ratio=1.0,
            polygon=Polygon([Point(-0.5,-0.5), Point(-0.5,0.5),
                             Point(0.5,0.5), Point(0.5,-0.5)]),
            area_discretization=9.0,
            rupture_mesh_spacing=1.0
        )
        site = Site(location=Point(0.0,0.0),
                    vs30=800.0,
                    vs30measured=True,
                    z1pt0=500.0,
                    z2pt5=2.0)
        gsims = {'Active Shallow Crust': BooreAtkinson2008()}
        imt = SA(period=0.1,damping=5.0)
        iml = 0.2
        time_span = 50.0
        truncation_level = 3.0
        tom = PoissonTOM(time_span)
        n_epsilons = 3
        mag_bin_width = 0.2
        # in km
        dist_bin_width = 10.0
        # in decimal degree
        coord_bin_width = 0.2

        # compute disaggregation
        bin_edges, diss_matrix = disagg.disaggregation(
            [src], site, imt, iml, gsims, tom, truncation_level, n_epsilons,
            mag_bin_width, dist_bin_width, coord_bin_width
        )
        mag_bins, dist_bins, lon_bins, lat_bins, eps_bins, trt_bins = bin_edges
        numpy.testing.assert_almost_equal(
            mag_bins, [5., 5.2, 5.4, 5.6, 5.8, 6., 6.2, 6.4, 6.6]
        )
        numpy.testing.assert_almost_equal(
            dist_bins, [0., 10., 20., 30., 40., 50., 60., 70., 80.]
        )
        numpy.testing.assert_almost_equal(
            lat_bins, [-0.6, -0.4, -0.2, 0., 0.2, 0.4, 0.6]
        )
        numpy.testing.assert_almost_equal(
            lon_bins, [-0.6, -0.4, -0.2, 0., 0.2, 0.4, 0.6]
        )
        numpy.testing.assert_almost_equal(
            eps_bins, [-3., -1., 1., 3.]
        )
        self.assertEqual(trt_bins, ['Active Shallow Crust'])

        expected_matrix = numpy.fromstring("""\
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\
""".decode('base64').decode('zip')).reshape((8, 8, 6, 6, 3, 1))
        numpy.testing.assert_almost_equal(diss_matrix, expected_matrix)
Exemple #16
0
    def test_areasource(self):
        nodalplane = NodalPlane(strike=0.0, dip=90.0, rake=0.0)
        src = AreaSource(source_id='src_1',
                         name='area source',
                         tectonic_region_type='Active Shallow Crust',
                         mfd=TruncatedGRMFD(a_val=3.5,
                                            b_val=1.0,
                                            min_mag=5.0,
                                            max_mag=6.5,
                                            bin_width=0.1),
                         nodal_plane_distribution=PMF([(1.0, nodalplane)]),
                         hypocenter_distribution=PMF([(1.0, 5.0)]),
                         upper_seismogenic_depth=0.0,
                         lower_seismogenic_depth=10.0,
                         magnitude_scaling_relationship=WC1994(),
                         rupture_aspect_ratio=1.0,
                         polygon=Polygon([
                             Point(-0.5, -0.5),
                             Point(-0.5, 0.5),
                             Point(0.5, 0.5),
                             Point(0.5, -0.5)
                         ]),
                         area_discretization=9.0,
                         rupture_mesh_spacing=1.0,
                         temporal_occurrence_model=PoissonTOM(50.))
        site = Site(location=Point(0.0, 0.0),
                    vs30=800.0,
                    vs30measured=True,
                    z1pt0=500.0,
                    z2pt5=2.0)
        gsims = {'Active Shallow Crust': BooreAtkinson2008()}
        imt = SA(period=0.1, damping=5.0)
        iml = 0.2
        truncation_level = 3.0
        n_epsilons = 3
        mag_bin_width = 0.2
        # in km
        dist_bin_width = 10.0
        # in decimal degree
        coord_bin_width = 0.2

        # compute disaggregation
        bin_edges, diss_matrix = disagg.disaggregation(
            [src], site, imt, iml, gsims, truncation_level, n_epsilons,
            mag_bin_width, dist_bin_width, coord_bin_width)
        mag_bins, dist_bins, lon_bins, lat_bins, eps_bins, trt_bins = bin_edges
        numpy.testing.assert_almost_equal(
            mag_bins, [5., 5.2, 5.4, 5.6, 5.8, 6., 6.2, 6.4, 6.6])
        numpy.testing.assert_almost_equal(
            dist_bins, [0., 10., 20., 30., 40., 50., 60., 70., 80.])
        numpy.testing.assert_almost_equal(
            lat_bins, [-0.6, -0.4, -0.2, 0., 0.2, 0.4, 0.6])
        numpy.testing.assert_almost_equal(
            lon_bins, [-0.6, -0.4, -0.2, 0., 0.2, 0.4, 0.6])
        numpy.testing.assert_almost_equal(eps_bins, [-3., -1., 1., 3.])
        self.assertEqual(trt_bins, ['Active Shallow Crust'])

        expected_matrix = numpy.fromstring(
            codecs.decode(
                codecs.decode(
                    b"""\
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\
""", 'base64'), 'zip')).reshape((8, 8, 6, 6, 3, 1))
        numpy.testing.assert_almost_equal(diss_matrix, expected_matrix)
Exemple #17
0
    def test_areasource(self):
        nodalplane = NodalPlane(strike=0.0, dip=90.0, rake=0.0)
        src = AreaSource(source_id='src_1',
                         name='area source',
                         tectonic_region_type='Active Shallow Crust',
                         mfd=TruncatedGRMFD(a_val=3.5,
                                            b_val=1.0,
                                            min_mag=5.0,
                                            max_mag=6.5,
                                            bin_width=0.1),
                         nodal_plane_distribution=PMF([(1.0, nodalplane)]),
                         hypocenter_distribution=PMF([(1.0, 5.0)]),
                         upper_seismogenic_depth=0.0,
                         lower_seismogenic_depth=10.0,
                         magnitude_scaling_relationship=WC1994(),
                         rupture_aspect_ratio=1.0,
                         polygon=Polygon([
                             Point(-0.5, -0.5),
                             Point(-0.5, 0.5),
                             Point(0.5, 0.5),
                             Point(0.5, -0.5)
                         ]),
                         area_discretization=9.0,
                         rupture_mesh_spacing=1.0,
                         temporal_occurrence_model=PoissonTOM(50.))
        site = Site(location=Point(0.0, 0.0),
                    vs30=800.0,
                    vs30measured=True,
                    z1pt0=500.0,
                    z2pt5=2.0)
        gsims = {'Active Shallow Crust': BooreAtkinson2008()}
        imt = SA(period=0.1, damping=5.0)
        iml = 0.2
        truncation_level = 3.0
        n_epsilons = 3
        mag_bin_width = 0.2
        # in km
        dist_bin_width = 10.0
        # in decimal degree
        coord_bin_width = 0.2

        # compute disaggregation
        bin_edges, diss_matrix = disagg.disaggregation(
            [src], site, imt, iml, gsims, truncation_level, n_epsilons,
            mag_bin_width, dist_bin_width, coord_bin_width)
        mag_bins, dist_bins, lon_bins, lat_bins, eps_bins, trt_bins = bin_edges
        numpy.testing.assert_almost_equal(
            mag_bins, [5., 5.2, 5.4, 5.6, 5.8, 6., 6.2, 6.4, 6.6])
        numpy.testing.assert_almost_equal(
            dist_bins, [0., 10., 20., 30., 40., 50., 60., 70., 80.])
        numpy.testing.assert_almost_equal(lat_bins, [
            -6.5544231e-01, -4.9158173e-01, -3.2772115e-01, -1.6386058e-01,
            1.1102230e-16, 1.6386058e-01, 3.2772115e-01, 4.9158173e-01,
            6.5544231e-01
        ])
        numpy.testing.assert_almost_equal(lon_bins, [
            -6.5544231e-01, -4.9158173e-01, -3.2772115e-01, -1.6386058e-01,
            1.1102230e-16, 1.6386058e-01, 3.2772115e-01, 4.9158173e-01,
            6.5544231e-01
        ])
        numpy.testing.assert_almost_equal(eps_bins, [-3., -1., 1., 3.])
        self.assertEqual(trt_bins, ['Active Shallow Crust'])

        self.assertEqual(diss_matrix.shape, (8, 8, 8, 8, 3, 1))
        expected = [
            0.0245487, 0.0231275, 0.0210702, 0.0185196, 0.0157001, 0.0130175,
            0.0107099, 0.0045489
        ]
        numpy.testing.assert_almost_equal(
            diss_matrix.sum(axis=(1, 2, 3, 4, 5)), expected)
    def test_areasource(self):
        nodalplane = NodalPlane(strike=0.0, dip=90.0, rake=0.0)
        src = AreaSource(
            source_id='src_1',
            name='area source',
            tectonic_region_type='Active Shallow Crust',
            mfd=TruncatedGRMFD(a_val=3.5, b_val=1.0, min_mag=5.0,
                               max_mag=6.5, bin_width=0.1),
            nodal_plane_distribution=PMF([(1.0, nodalplane)]),
            hypocenter_distribution=PMF([(1.0, 5.0)]),
            upper_seismogenic_depth=0.0,
            lower_seismogenic_depth=10.0,
            magnitude_scaling_relationship=WC1994(),
            rupture_aspect_ratio=1.0,
            polygon=Polygon([Point(-0.5, -0.5), Point(-0.5, 0.5),
                             Point(0.5, 0.5), Point(0.5, -0.5)]),
            area_discretization=9.0,
            rupture_mesh_spacing=1.0,
            temporal_occurrence_model=PoissonTOM(50.)
        )
        site = Site(location=Point(0.0, 0.0),
                    vs30=800.0,
                    vs30measured=True,
                    z1pt0=500.0,
                    z2pt5=2.0)
        gsims = {'Active Shallow Crust': BooreAtkinson2008()}
        imt = SA(period=0.1, damping=5.0)
        iml = 0.2
        truncation_level = 3.0
        n_epsilons = 3
        mag_bin_width = 0.2
        # in km
        dist_bin_width = 10.0
        # in decimal degree
        coord_bin_width = 0.2

        # compute disaggregation
        bin_edges, diss_matrix = disagg.disaggregation(
            [src], site, imt, iml, gsims, truncation_level,
            n_epsilons, mag_bin_width, dist_bin_width, coord_bin_width
        )
        mag_bins, dist_bins, lon_bins, lat_bins, eps_bins, trt_bins = bin_edges
        numpy.testing.assert_almost_equal(
            mag_bins, [5., 5.2, 5.4, 5.6, 5.8, 6., 6.2, 6.4, 6.6]
        )
        numpy.testing.assert_almost_equal(
            dist_bins, [0., 10., 20., 30., 40., 50., 60., 70., 80.]
        )
        numpy.testing.assert_almost_equal(
            lat_bins, [-0.6, -0.4, -0.2, 0., 0.2, 0.4, 0.6]
        )
        numpy.testing.assert_almost_equal(
            lon_bins, [-0.6, -0.4, -0.2, 0., 0.2, 0.4, 0.6]
        )
        numpy.testing.assert_almost_equal(
            eps_bins, [-3., -1., 1., 3.]
        )
        self.assertEqual(trt_bins, ['Active Shallow Crust'])

        expected_matrix = numpy.fromstring(codecs.decode(codecs.decode(b"""\
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\
""", 'base64'), 'zip')).reshape((8, 8, 6, 6, 3, 1))
        numpy.testing.assert_almost_equal(diss_matrix, expected_matrix)