def setUp(self):
     """
     Builds a simple dipping/bending fault source with a characteristic
     source model. Compares the curves for four sites, two on the hanging
     wall and two on the footwall.
     The source model is taken from the PEER Tests
     """
     point_order_dipping_east = [Point(-64.78365, -0.45236),
                                 Point(-64.80164, -0.45236),
                                 Point(-64.90498, -0.36564),
                                 Point(-65.0000, -0.16188),
                                 Point(-65.0000, 0.0000)]
     trace_dip_east = Line(point_order_dipping_east)
     site_1 = Site(Point(-64.98651, -0.15738), 760.0, 48.0, 0.607,
                   vs30measured=True)
     site_2 = Site(Point(-64.77466, -0.45686), 760.0, 48.0, 0.607,
                   vs30measured=True)
     site_3 = Site(Point(-64.92747, -0.38363), 760.0, 48.0, 0.607,
                   vs30measured=True)
     site_4 = Site(Point(-65.05396, -0.17088), 760.0, 48.0, 0.607,
                   vs30measured=True)
     self.sites = SiteCollection([site_1, site_2, site_3, site_4])
     self.imtls = {"PGA": [0.001, 0.01, 0.05, 0.1, 0.15, 0.2, 0.25, 0.3,
                           0.35, 0.4, 0.45, 0.5, 0.55, 0.6, 0.7, 0.8, 0.9,
                           1.0]}
     fault_surface1 = SimpleFaultSurface.from_fault_data(
         trace_dip_east, 0.0, 12.0, 60., 0.5)
     mfd1 = EvenlyDiscretizedMFD(6.75, 0.01, [0.01])
     tom = PoissonTOM(1.0)
     self.sources = [
         CharacteristicFaultSource(
             "PEER_CHAR_FLT_EAST",
             "Peer Bending Fault Dipping East - Characteristic",
             "Active Shallow Crust",
             mfd1,
             tom,
             fault_surface1,
             90.0)]
     # We will check all the GMPEs
     self.gsim_set = {
         "ASK": [AbrahamsonEtAl2014NSHMPMean(),
                 (0.185, AbrahamsonEtAl2014NSHMPLower()),
                 (0.63, AbrahamsonEtAl2014()),
                 (0.185, AbrahamsonEtAl2014NSHMPUpper())],
         "BSSA": [BooreEtAl2014NSHMPMean(),
                  (0.185, BooreEtAl2014NSHMPLower()),
                  (0.63, BooreEtAl2014()),
                  (0.185, BooreEtAl2014NSHMPUpper())],
         "CB": [CampbellBozorgnia2014NSHMPMean(),
                (0.185, CampbellBozorgnia2014NSHMPLower()),
                (0.63, CampbellBozorgnia2014()),
                (0.185, CampbellBozorgnia2014NSHMPUpper())],
         "CY": [ChiouYoungs2014NSHMPMean(),
                (0.185, ChiouYoungs2014NSHMPLower()),
                (0.63, ChiouYoungs2014()),
                (0.185, ChiouYoungs2014NSHMPUpper())],
         "ID": [Idriss2014NSHMPMean(),
                (0.185, Idriss2014NSHMPLower()),
                (0.63, Idriss2014()),
                (0.185, Idriss2014NSHMPUpper())]}
Example #2
0
def _setup_fault_source():
    """
    Builds a fault source using the PEER Bending Fault case.
    """
    point_order_dipping_east = [
        Point(-64.78365, -0.45236),
        Point(-64.80164, -0.45236),
        Point(-64.90498, -0.36564),
        Point(-65.0000, -0.16188),
        Point(-65.0000, 0.0000)
    ]
    trace_dip_east = Line(point_order_dipping_east)
    fault_surface1 = SimpleFaultSurface.from_fault_data(
        trace_dip_east, 0.0, 12.0, 60., 1.0)
    # Activity Rates
    # cm per km2
    area = 60. * 12.0 / np.sin(np.radians(60.))
    cm2perkm2 = (100. * 1000.)**2.
    mo1 = 3.0E11 * 0.2 * (area * cm2perkm2)
    mo_m6p75 = 10.0**(16.05 + 1.5 * 6.75)
    rate1 = mo1 / mo_m6p75
    mfd1 = EvenlyDiscretizedMFD(6.75, 0.01, [rate1])
    tom = PoissonTOM(1.0)
    aspect = 2.0
    rake = 90.0
    src = SimpleFaultSource("PEER_FLT_EAST", "PEER Bending Fault Dipping East",
                            "Active Shallow Crust", mfd1, 1.0, PeerMSR(), 2.0,
                            tom, 0.0, 12.0, trace_dip_east, 60.0, rake)
    src.num_ruptures = src.count_ruptures()
    return src
def fault_shapefile_to_dictionary(filename, mesh_spacing=1.0):
    """
    
    """
    sf = shapefile.Reader(filename)
    data = []
    fields = [val[0] for val in sf.fields[1:]]
    for rec in sf.shapeRecords():
        rec_data = dict([(field, rec.record[i])
                         for i, field in enumerate(fields)])
        # Parse geometry
        rec_data["geometry"] = np.array(rec.shape.points)
        data.append(rec_data)
    # Cleanup dict
    cleaned_data = []
    for rec in data:
        cleaned_rec = {}
        cleaned_rec["ID"] = rec["IDSOURCE"]
        cleaned_rec["dip"] = (rec["DIPMIN"], rec["DIPMAX"])
        cleaned_rec["name"] = rec["SOURCENAME"]
        cleaned_rec["rake"] = (rec["RAKEMIN"], rec["RAKEMAX"])
        cleaned_rec["LSD"] = rec["MAXDEPTH"]
        cleaned_rec["USD"] = rec["MINDEPTH"]
        cleaned_rec["slip"] = (rec["SRMIN"], rec["SRMAX"])
        # Build surfaces
        cleaned_rec["trace"] = Line(
            [Point(row[0], row[1]) for row in rec["geometry"]])
        cleaned_rec["surfaces"] = (
            SimpleFaultSurface.from_fault_data(
                cleaned_rec["trace"],
                cleaned_rec["USD"],
                cleaned_rec["LSD"],
                cleaned_rec["dip"][1],  # Highest dip -> smallest area
                mesh_spacing),
            SimpleFaultSurface.from_fault_data(
                cleaned_rec["trace"],
                cleaned_rec["USD"],
                cleaned_rec["LSD"],
                cleaned_rec["dip"][0],  # Lowest dip -> largest area
                mesh_spacing))
        cleaned_data.append(cleaned_rec)
    return cleaned_data
Example #4
0
def simple_fault_surface_from_dict(data, mesh_spacing=1.):
    """
    Builds a simple fault surface from the json load
    """
    assert "SimpleFaultSurface" in data
    trace = []
    for lon, lat in data["trace"]:
        trace.append(Point(lon, lat, 0.0))
    trace = Line(trace)
    return SimpleFaultSurface.from_fault_data(trace, data["upperSeismoDepth"],
                                              data["lowerSeismoDepth"],
                                              data["dip"], mesh_spacing)
def trace_to_surface(trace, **kwargs):
    coords = trace['geometry']['coordinates'][0]
    point_list = [Point(*c) for c in coords]

    sfs_args = kwargs

    if 'dip' not in sfs_args:
        sfs_args['dip'] = trace['properties']['dip']

    sfs = SimpleFaultSurface.from_fault_data(fault_trace=Line(point_list),
                                             **sfs_args)
    return sfs
Example #6
0
def simple_fault_surface_from_dict(data, mesh_spacing=1.):
    """
    Builds a simple fault surface from the json load
    """
    assert "SimpleFaultSurface" in data
    trace = []
    for lon, lat in data["trace"]:
        trace.append(Point(lon, lat, 0.0))
    trace = Line(trace)
    return SimpleFaultSurface.from_fault_data(trace, data["upperSeismoDepth"],
                                              data["lowerSeismoDepth"],
                                              data["dip"], mesh_spacing)
Example #7
0
    def test_non_parametric_source(self):
        # non-parametric source equivalent to case 2 simple fault source
        data = test_data.SET1_CASE2_SOURCE_DATA
        ruptures = []
        for i in range(data['num_rups_dip']):
            for j in range(data['num_rups_strike']):
                lons = data['lons']
                lats = data['lats'][j]
                depths = data['depths'][i]
                mesh = RectangularMesh(lons, lats, depths)
                surf = SimpleFaultSurface(mesh)
                hypo = Point(
                    data['hypo_lons'][i, j],
                    data['hypo_lats'][i, j],
                    data['hypo_depths'][i, j]
                )
                rup = BaseRupture(data['mag'], data['rake'],
                                  data['tectonic_region_type'], hypo, surf,
                                  data['source_typology'])
                ruptures.append((rup, data['pmf']))
        npss = NonParametricSeismicSource(
            'id', 'name', data['tectonic_region_type'], ruptures
        )
        sites = SiteCollection([
            test_data.SET1_CASE1TO9_SITE1, test_data.SET1_CASE1TO9_SITE2,
            test_data.SET1_CASE1TO9_SITE3, test_data.SET1_CASE1TO9_SITE4,
            test_data.SET1_CASE1TO9_SITE5, test_data.SET1_CASE1TO9_SITE6,
            test_data.SET1_CASE1TO9_SITE7
        ])
        gsims = {const.TRT.ACTIVE_SHALLOW_CRUST: SadighEtAl1997()}
        truncation_level = 0
        imts = {str(test_data.IMT): test_data.SET1_CASE2_IMLS}

        curves = calc_hazard_curves(
            [npss], sites, imts, gsims, truncation_level)
        s1hc, s2hc, s3hc, s4hc, s5hc, s6hc, s7hc = curves[str(test_data.IMT)]

        assert_hazard_curve_is(self, s1hc, test_data.SET1_CASE2_SITE1_POES,
                               atol=3e-3, rtol=1e-5)
        assert_hazard_curve_is(self, s2hc, test_data.SET1_CASE2_SITE2_POES,
                               atol=2e-5, rtol=1e-5)
        assert_hazard_curve_is(self, s3hc, test_data.SET1_CASE2_SITE3_POES,
                               atol=2e-5, rtol=1e-5)
        assert_hazard_curve_is(self, s4hc, test_data.SET1_CASE2_SITE4_POES,
                               atol=1e-3, rtol=1e-5)
        assert_hazard_curve_is(self, s5hc, test_data.SET1_CASE2_SITE5_POES,
                               atol=1e-3, rtol=1e-5)
        assert_hazard_curve_is(self, s6hc, test_data.SET1_CASE2_SITE6_POES,
                               atol=1e-3, rtol=1e-5)
        assert_hazard_curve_is(self, s7hc, test_data.SET1_CASE2_SITE7_POES,
                               atol=2e-5, rtol=1e-5)
def _construct_surface(lons, lats, upper_depth, lower_depth):
    """
    Utility method that constructs and return a simple fault surface with top
    edge specified by `lons` and `lats` and extending vertically from
    `upper_depth` to `lower_depth`.

    The underlying mesh is built by repeating the same coordinates
    (`lons` and `lats`) at the two specified depth levels.
    """
    depths = np.array(
        [np.zeros_like(lons) + upper_depth,
         np.zeros_like(lats) + lower_depth])

    mesh = RectangularMesh(np.tile(lons, (2, 1)), np.tile(lats, (2, 1)),
                           depths)
    return SimpleFaultSurface(mesh)
Example #9
0
def _setup_peer_test_bending_fault_config():
    """
    The GC2 tests will be based on variations of the PEER bending fault
    test case:

    (Fault is dipping east north east
    Point 5 (-65.0, 0.0, 0.0)
        o
        |
        |
        |
        o Point 4 (-65.0, -0.16188, 0)
         \
          \
           \
            \
             \
              o Point 3 (-64.90498, -0.36564, 0.0)
               \__
                  \__
                     \__
                        \__
                           \__Point 2 (-64.80164, -0.45236, 0.0)
                              \o---o Point 1 (-64.78365, -0.45236, 0.0)
    """
    # Build separate faults
    # Get down-dip points - dipping east-noth-east
    strike1 = PNT1.azimuth(PNT2)
    dipdir1 = (strike1 + 90.) % 360.0

    strike2 = PNT2.azimuth(PNT3)
    dipdir2 = (strike2 + 90.) % 360.0

    strike3 = PNT3.azimuth(PNT4)
    dipdir3 = (strike3 + 90.) % 360.0

    strike4 = PNT4.azimuth(PNT5)
    dipdir4 = (strike4 + 90.) % 360.0

    global_strike = PNT1.azimuth(PNT5)
    global_dipdir = (global_strike + 90.) % 360.0
    # Get lower trace
    usd = 0.0
    lsd = 12.0
    dip = 60.0
    as_length = lsd / numpy.tan(numpy.radians(dip))
    PNT1b = PNT1.point_at(as_length, lsd, global_dipdir)
    PNT2b = PNT2.point_at(as_length, lsd, global_dipdir)
    PNT3b = PNT3.point_at(as_length, lsd, global_dipdir)
    PNT4b = PNT4.point_at(as_length, lsd, global_dipdir)
    PNT5b = PNT5.point_at(as_length, lsd, global_dipdir)
    # As simple fault dipping east
    mesh_spacing = 0.5
    simple_fault1 = SimpleFaultSurface.from_fault_data(
        Line([PNT1, PNT2, PNT3, PNT4, PNT5]), usd, lsd, dip, mesh_spacing)
    # As a set of planes describing a concordant "Stirling fault"
    stirling_planes = [
        PlanarSurface.from_corner_points(PNT1, PNT2, PNT2b, PNT1b),
        PlanarSurface.from_corner_points(PNT2, PNT3, PNT3b, PNT2b),
        PlanarSurface.from_corner_points(PNT3, PNT4, PNT4b, PNT3b),
        PlanarSurface.from_corner_points(PNT4, PNT5, PNT5b, PNT4b)
    ]
    stirling_fault1 = MultiSurface(stirling_planes)

    # As a set of planes describing a concordant "Frankel Fault"
    # In the Frankel fault each segment is projected to the local dip direction
    dipdir2b = (dipdir2 + 180.) % 360.0

    frankel_planes = [
        PlanarSurface.from_corner_points(
            PNT1, PNT2, PNT2.point_at(as_length, lsd, dipdir1),
            PNT1.point_at(as_length, lsd, dipdir1)),
        PlanarSurface.from_corner_points(
            PNT2, PNT3, PNT3.point_at(as_length, lsd, dipdir2),
            PNT2.point_at(as_length, lsd, dipdir2)),
        PlanarSurface.from_corner_points(
            PNT3, PNT4, PNT4.point_at(as_length, lsd, dipdir3),
            PNT3.point_at(as_length, lsd, dipdir3)),
        PlanarSurface.from_corner_points(
            PNT4, PNT5, PNT5.point_at(as_length, lsd, dipdir4),
            PNT4.point_at(as_length, lsd, dipdir4))
    ]
    frankel_fault1 = MultiSurface(frankel_planes)

    # Test the case of a discordant Frankel plane
    # Swapping the strike of the second segment to change the dip direction
    # Also increasing the dip from 60 degrees to 75 degrees
    as_length_alt = lsd / numpy.tan(numpy.radians(75.0))
    frankel_discordant = [
        PlanarSurface.from_corner_points(
            PNT1, PNT2, PNT2.point_at(as_length, lsd, dipdir1),
            PNT1.point_at(as_length, lsd, dipdir1)),
        PlanarSurface.from_corner_points(
            PNT3, PNT2, PNT2.point_at(as_length_alt, lsd, dipdir2b),
            PNT3.point_at(as_length_alt, lsd, dipdir2b)),
        PlanarSurface.from_corner_points(
            PNT3, PNT4, PNT4.point_at(as_length, lsd, dipdir3),
            PNT3.point_at(as_length, lsd, dipdir3)),
        PlanarSurface.from_corner_points(
            PNT4, PNT5, PNT5.point_at(as_length, lsd, dipdir4),
            PNT4.point_at(as_length, lsd, dipdir4))
    ]
    frankel_fault2 = MultiSurface(frankel_discordant)
    return simple_fault1, stirling_fault1, frankel_fault1, frankel_fault2
Example #10
0
def _setup_peer_test_bending_fault_config():
    """
    The GC2 tests will be based on variations of the PEER bending fault
    test case:

    (Fault is dipping east north east
    Point 5 (-65.0, 0.0, 0.0)
        o
        |
        |
        |
        o Point 4 (-65.0, -0.16188, 0)
         \
          \
           \
            \
             \
              o Point 3 (-64.90498, -0.36564, 0.0)
               \__
                  \__
                     \__
                        \__
                           \__Point 2 (-64.80164, -0.45236, 0.0)
                              \o---o Point 1 (-64.78365, -0.45236, 0.0)
    """
    # Build separate faults
    # Get down-dip points - dipping east-noth-east
    strike1 = PNT1.azimuth(PNT2)
    dipdir1 = (strike1 + 90.) % 360.0

    strike2 = PNT2.azimuth(PNT3)
    dipdir2 = (strike2 + 90.) % 360.0

    strike3 = PNT3.azimuth(PNT4)
    dipdir3 = (strike3 + 90.) % 360.0

    strike4 = PNT4.azimuth(PNT5)
    dipdir4 = (strike4 + 90.) % 360.0

    global_strike = PNT1.azimuth(PNT5)
    global_dipdir = (global_strike + 90.) % 360.0
    # Get lower trace
    usd = 0.0
    lsd = 12.0
    dip = 60.0
    as_length = lsd / numpy.tan(numpy.radians(dip))
    PNT1b = PNT1.point_at(as_length, lsd, global_dipdir)
    PNT2b = PNT2.point_at(as_length, lsd, global_dipdir)
    PNT3b = PNT3.point_at(as_length, lsd, global_dipdir)
    PNT4b = PNT4.point_at(as_length, lsd, global_dipdir)
    PNT5b = PNT5.point_at(as_length, lsd, global_dipdir)
    # As simple fault dipping east
    mesh_spacing = 0.5
    simple_fault1 = SimpleFaultSurface.from_fault_data(
        Line([PNT1, PNT2, PNT3, PNT4, PNT5]), usd, lsd, dip, mesh_spacing)
    # As a set of planes describing a concordant "Stirling fault"
    stirling_planes = [
        PlanarSurface.from_corner_points(1.0, PNT1, PNT2, PNT2b, PNT1b),
        PlanarSurface.from_corner_points(1.0, PNT2, PNT3, PNT3b, PNT2b),
        PlanarSurface.from_corner_points(1.0, PNT3, PNT4, PNT4b, PNT3b),
        PlanarSurface.from_corner_points(1.0, PNT4, PNT5, PNT5b, PNT4b)
    ]
    stirling_fault1 = MultiSurface(stirling_planes)

    # As a set of planes describing a concordant "Frankel Fault"
    # In the Frankel fault each segment is projected to the local dip direction
    dipdir2b = (dipdir2 + 180.) % 360.0

    frankel_planes = [
        PlanarSurface.from_corner_points(
            1.0, PNT1, PNT2,
            PNT2.point_at(as_length, lsd, dipdir1),
            PNT1.point_at(as_length, lsd, dipdir1)
            ),
        PlanarSurface.from_corner_points(
            1.0, PNT2, PNT3,
            PNT3.point_at(as_length, lsd, dipdir2),
            PNT2.point_at(as_length, lsd, dipdir2)
            ),
        PlanarSurface.from_corner_points(
            1.0, PNT3, PNT4,
            PNT4.point_at(as_length, lsd, dipdir3),
            PNT3.point_at(as_length, lsd, dipdir3)
            ),
        PlanarSurface.from_corner_points(
            1.0, PNT4, PNT5,
            PNT5.point_at(as_length, lsd, dipdir4),
            PNT4.point_at(as_length, lsd, dipdir4)
            )
        ]
    frankel_fault1 = MultiSurface(frankel_planes)

    # Test the case of a discordant Frankel plane
    # Swapping the strike of the second segment to change the dip direction
    # Also increasing the dip from 60 degrees to 75 degrees
    as_length_alt = lsd / numpy.tan(numpy.radians(75.0))
    frankel_discordant = [
        PlanarSurface.from_corner_points(
            1.0, PNT1, PNT2,
            PNT2.point_at(as_length, lsd, dipdir1),
            PNT1.point_at(as_length, lsd, dipdir1)
            ),
        PlanarSurface.from_corner_points(
            1.0, PNT3, PNT2,
            PNT2.point_at(as_length_alt, lsd, dipdir2b),
            PNT3.point_at(as_length_alt, lsd, dipdir2b)
            ),
        PlanarSurface.from_corner_points(
            1.0, PNT3, PNT4,
            PNT4.point_at(as_length, lsd, dipdir3),
            PNT3.point_at(as_length, lsd, dipdir3)
            ),
        PlanarSurface.from_corner_points(
            1.0, PNT4, PNT5,
            PNT5.point_at(as_length, lsd, dipdir4),
            PNT4.point_at(as_length, lsd, dipdir4)
            )
        ]
    frankel_fault2 = MultiSurface(frankel_discordant)
    return simple_fault1, stirling_fault1, frankel_fault1, frankel_fault2
 def setUp(self):
     """
     Builds a simple dipping/bending fault source with a characteristic
     source model. Compares the curves for four sites, two on the hanging
     wall and two on the footwall.
     The source model is taken from the PEER Tests
     """
     point_order_dipping_east = [
         Point(-64.78365, -0.45236),
         Point(-64.80164, -0.45236),
         Point(-64.90498, -0.36564),
         Point(-65.0000, -0.16188),
         Point(-65.0000, 0.0000)
     ]
     trace_dip_east = Line(point_order_dipping_east)
     site_1 = Site(Point(-64.98651, -0.15738), 760.0, True, 48.0, 0.607)
     site_2 = Site(Point(-64.77466, -0.45686), 760.0, True, 48.0, 0.607)
     site_3 = Site(Point(-64.92747, -0.38363), 760.0, True, 48.0, 0.607)
     site_4 = Site(Point(-65.05396, -0.17088), 760.0, True, 48.0, 0.607)
     self.sites = SiteCollection([site_1, site_2, site_3, site_4])
     self.imtls = {
         "PGA": [
             0.001, 0.01, 0.05, 0.1, 0.15, 0.2, 0.25, 0.3, 0.35, 0.4, 0.45,
             0.5, 0.55, 0.6, 0.7, 0.8, 0.9, 1.0
         ]
     }
     fault_surface1 = SimpleFaultSurface.from_fault_data(
         trace_dip_east, 0.0, 12.0, 60., 0.5)
     mfd1 = EvenlyDiscretizedMFD(6.75, 0.01, [0.01])
     tom = PoissonTOM(1.0)
     self.sources = [
         CharacteristicFaultSource(
             "PEER_CHAR_FLT_EAST",
             "Peer Bending Fault Dipping East - Characteristic",
             "Active Shallow Crust", mfd1, tom, fault_surface1, 90.0)
     ]
     # We will check all the GMPEs
     self.gsim_set = {
         "ASK": [
             AbrahamsonEtAl2014NSHMPMean(),
             (0.185, AbrahamsonEtAl2014NSHMPLower()),
             (0.63, AbrahamsonEtAl2014()),
             (0.185, AbrahamsonEtAl2014NSHMPUpper())
         ],
         "BSSA": [
             BooreEtAl2014NSHMPMean(), (0.185, BooreEtAl2014NSHMPLower()),
             (0.63, BooreEtAl2014()), (0.185, BooreEtAl2014NSHMPUpper())
         ],
         "CB": [
             CampbellBozorgnia2014NSHMPMean(),
             (0.185, CampbellBozorgnia2014NSHMPLower()),
             (0.63, CampbellBozorgnia2014()),
             (0.185, CampbellBozorgnia2014NSHMPUpper())
         ],
         "CY": [
             ChiouYoungs2014NSHMPMean(),
             (0.185, ChiouYoungs2014NSHMPLower()),
             (0.63, ChiouYoungs2014()), (0.185, ChiouYoungs2014NSHMPUpper())
         ],
         "ID": [
             Idriss2014NSHMPMean(), (0.185, Idriss2014NSHMPLower()),
             (0.63, Idriss2014()), (0.185, Idriss2014NSHMPUpper())
         ]
     }