예제 #1
0
def test_fromTrace():
    xp0 = [0.0]
    xp1 = [0.0]
    yp0 = [0.0]
    yp1 = [0.05]
    zp = [0.0]
    widths = [10.0]
    dips = [45.0]

    # Rupture requires an origin even when not used:
    origin = Origin({'eventsourcecode': 'test', 'lat': 0, 'lon': 0,
                     'depth': 5.0, 'mag': 7.0})
    rupture = QuadRupture.fromTrace(
        xp0, yp0, xp1, yp1, zp, widths,
        dips, origin,
        reference='From J Smith, (personal communication)')
    fstr = io.StringIO()
    rupture.writeTextFile(fstr)

    xp0 = [-121.81529, -121.82298]
    xp1 = [-121.82298, -121.83068]
    yp0 = [37.73707, 37.74233]
    yp1 = [37.74233, 37.74758]
    zp = [10, 15]
    widths = [15.0, 20.0]
    dips = [30.0, 45.0]
    rupture = QuadRupture.fromTrace(
        xp0, yp0, xp1, yp1, zp, widths,
        dips, origin,
        reference='From J Smith, (personal communication)')
예제 #2
0
def test_map_rupture(interactive=False):
    xp0 = np.array([-90.898000])
    xp1 = np.array([-91.308000])
    yp0 = np.array([12.584000])
    yp1 = np.array([12.832000])
    zp = [0.0]
    strike = azimuth(yp0[0], xp0[0], yp1[0], xp1[0])
    origin = Origin({
        'lat': 0.0,
        'lon': 0.0,
        'depth': 0.0,
        'mag': 5.5,
        'eventsourcecode': 'abcd'
    })
    interface_width = MAX_DEPTH / np.sin(np.radians(DIP))
    widths = np.ones(xp0.shape) * interface_width
    dips = np.ones(xp0.shape) * DIP
    strike = [strike]
    rupture = QuadRupture.fromTrace(xp0,
                                    yp0,
                                    xp1,
                                    yp1,
                                    zp,
                                    widths,
                                    dips,
                                    origin,
                                    strike=strike)
    map_rupture(rupture)
    if interactive:
        fname = os.path.join(os.path.expanduser('~'), 'rupture_map.png')
        plt.savefig(fname)
        print('Rupture map plot saved to %s.  Delete this file if you wish.' %
              fname)
예제 #3
0
def test_slip():

    # Rupture requires an origin even when not used:
    origin = Origin({
        'id': 'test',
        'lon': 0,
        'lat': 0,
        'depth': 5.0,
        'mag': 7.0,
        'netid': 'us',
        'network': '',
        'locstring': '',
        'time': HistoricTime.utcfromtimestamp(time.time())
    })

    # Make a rupture
    lat0 = np.array([34.1])
    lon0 = np.array([-118.2])
    lat1 = np.array([34.2])
    lon1 = np.array([-118.15])
    z = np.array([1.0])
    W = np.array([3.0])
    dip = np.array([30.])
    rup = QuadRupture.fromTrace(lon0, lat0, lon1, lat1, z, W, dip, origin)

    slp = get_quad_slip(rup.getQuadrilaterals()[0], 30).getArray()
    slpd = np.array([0.80816457, 0.25350787, 0.53160491])
    np.testing.assert_allclose(slp, slpd)

    slp = get_local_unit_slip_vector(22, 30, 86).getArray()
    slpd = np.array([0.82714003, 0.38830563, 0.49878203])
    np.testing.assert_allclose(slp, slpd)
예제 #4
0
def rupture_from_dict(d):
    """
    Method returns either a Rupture subclass (QuadRupture, EdgeRupture, or
    PointRupture) object based on a GeoJSON dictionary.

    .. seealso::
        :func:`rupture_from_dict_and_origin`

    Args:
        d (dict): Rupture GeoJSON dictionary, which must contain origin
            information in the 'metadata' field.

    Returns:
        a Rupture subclass.

    """
    validate_json(d)

    origin = Origin(d['metadata'])

    # What type of rupture is this?
    geo_type = d['features'][0]['geometry']['type']
    if geo_type == 'MultiPolygon':
        # EdgeRupture will have 'mesh_dx' in metadata
        if 'mesh_dx' in d['metadata']:
            mesh_dx = d['metadata']['mesh_dx']
            rupt = EdgeRupture(d, origin, mesh_dx=mesh_dx)
        else:
            rupt = QuadRupture(d, origin)
    elif geo_type == 'Point':
        rupt = PointRupture(origin)

    return rupt
예제 #5
0
def test_slip():

    # Rupture requires an origin even when not used:
    origin = Origin({
        'id': 'test',
        'lon': 0,
        'lat': 0,
        'depth': 5.0,
        'mag': 7.0,
        'netid': 'us',
        'network': '',
        'locstring': '',
        'time': HistoricTime.utcfromtimestamp(time.time())
    })

    # Make a rupture
    lat0 = np.array([34.1])
    lon0 = np.array([-118.2])
    lat1 = np.array([34.2])
    lon1 = np.array([-118.15])
    z = np.array([1.0])
    W = np.array([3.0])
    dip = np.array([30.])
    rup = QuadRupture.fromTrace(lon0, lat0, lon1, lat1, z, W, dip, origin)

    slp = get_quad_slip(rup.getQuadrilaterals()[0], 30).getArray()
    slpd = np.array([0.80816457, 0.25350787, 0.53160491])
    np.testing.assert_allclose(slp, slpd)

    slp = get_quad_strike_vector(rup.getQuadrilaterals()[0]).getArray()
    slpd = np.array([0.58311969, 0.27569625, 0.76417472])
    np.testing.assert_allclose(slp, slpd)

    slp = get_quad_down_dip_vector(rup.getQuadrilaterals()[0]).getArray()
    slpd = np.array([0.81219873, -0.17763484, -0.55567895])
    np.testing.assert_allclose(slp, slpd)

    slp = get_local_unit_slip_vector(22, 30, 86).getArray()
    slpd = np.array([0.82714003, 0.38830563, 0.49878203])
    np.testing.assert_allclose(slp, slpd)

    slp = get_local_unit_slip_vector_DS(22, 30, -86).getArray()
    slpd = np.array([-0.80100879, -0.32362856, -0.49878203])
    np.testing.assert_allclose(slp, slpd)

    slp = get_local_unit_slip_vector_SS(22, 80, 5).getArray()
    slpd = np.array([0.3731811, 0.92365564, 0.])
    np.testing.assert_allclose(slp, slpd)

    mech = rake_to_mech(-160)
    assert mech == 'SS'
    mech = rake_to_mech(0)
    assert mech == 'SS'
    mech = rake_to_mech(160)
    assert mech == 'SS'
    mech = rake_to_mech(-80)
    assert mech == 'NM'
    mech = rake_to_mech(80)
    assert mech == 'RS'
예제 #6
0
def test_ss3_m4p5():
    magnitude = 4.5
    dip = np.array([90])
    rake = 180.0
    width = np.array([15])
    rupx = np.array([0, 0])
    rupy = np.array([0, 80])
    zp = np.array([0])
    epix = np.array([0])
    epiy = np.array([0.2 * rupy[1]])

    # Convert to lat/lon
    proj = OrthographicProjection(-122, -120, 39, 37)
    tlon, tlat = proj(rupx, rupy, reverse=True)
    epilon, epilat = proj(epix, epiy, reverse=True)

    # Origin
    origin = Origin({'lat': epilat[0],
                     'lon': epilon[0],
                     'depth': 10,
                     'mag': magnitude,
                     'id': 'ss3',
                     'netid': '',
                     'network': '',
                     'locstring': '',
                     'rake': rake,
                     'time': HistoricTime.utcfromtimestamp(int(time.time()))})

    rup = QuadRupture.fromTrace(
        np.array([tlon[0]]), np.array([tlat[0]]),
        np.array([tlon[1]]), np.array([tlat[1]]),
        zp, width, dip, origin, reference='ss3')

    x = np.linspace(0, 20, 6)
    y = np.linspace(0, 90, 11)
    site_x, site_y = np.meshgrid(x, y)
    slon, slat = proj(site_x, site_y, reverse=True)
    deps = np.zeros_like(slon)

    test1 = Bayless2013(origin, rup, slat, slon, deps, T=1.0)

    # Test fd
    fd = test1.getFd()
    fd_test = np.array(
        [[0.,  0.,  0.,  0.,  0.,  0.],
         [0.,  0.,  0.,  0.,  0.,  0.],
            [0.,  0.,  0.,  0.,  0.,  0.],
            [0.,  0.,  0.,  0.,  0.,  0.],
            [0.,  0.,  0.,  0.,  0.,  0.],
            [0.,  0.,  0.,  0.,  0.,  0.],
            [0.,  0.,  0.,  0.,  0.,  0.],
            [0.,  0.,  0.,  0.,  0.,  0.],
            [0.,  0.,  0.,  0.,  0.,  0.],
            [0.,  0.,  0.,  0.,  0.,  0.],
            [0.,  0.,  0.,  0.,  0.,  0.]])
    np.testing.assert_allclose(
        fd, fd_test, rtol=1e-4)
예제 #7
0
def test_EdgeRupture_vs_QuadRupture():
    # Sites stuff
    sites = Sites.fromCenter(-122.15, 37.15, 1.5, 1.5, 0.01, 0.01)
    sm_dict = sites._GeoDict
    west = sm_dict.xmin
    east = sm_dict.xmax
    south = sm_dict.ymin
    north = sm_dict.ymax
    nx = sm_dict.nx
    ny = sm_dict.ny
    lats = np.linspace(north, south, ny)
    lons = np.linspace(west, east, nx)
    lon, lat = np.meshgrid(lons, lats)
    dep = np.zeros_like(lon)

    # Construct QuadRupture
    xp0 = np.array([-122.0, -122.5])
    yp0 = np.array([37.1, 37.4])
    xp1 = np.array([-121.7, -122.3])
    yp1 = np.array([37.2, 37.2])
    zp = np.array([0, 6])
    widths = np.array([30, 20])
    dips = np.array([30, 40])

    origin = Origin({
        'lat': 33.15,
        'lon': -122.15,
        'depth': 0,
        'mag': 7.2,
        'id': '',
        'netid': '',
        'network': '',
        'locstring': '',
        'time': HistoricTime.utcfromtimestamp(time.time())
    })
    qrup = QuadRupture.fromTrace(xp0, yp0, xp1, yp1, zp, widths, dips, origin)
    rrup_q = qrup.computeRrup(lon, lat, dep)
    rjb_q = qrup.computeRjb(lon, lat, dep)

    # Construct equivalent EdgeRupture
    toplons = np.array([-122.0, -121.7, -122.5, -122.3])
    toplats = np.array([37.1, 37.2, 37.4, 37.2])
    topdeps = np.array([0, 0, 6, 6])
    botlons = np.array([-121.886864, -121.587568, -122.635467, -122.435338])
    botlats = np.array([36.884527, 36.984246, 37.314035, 37.114261])
    botdeps = np.array([15.0000, 14.9998, 18.8558, 18.8559])
    group_index = [0, 0, 1, 1]

    erup = EdgeRupture.fromArrays(toplons, toplats, topdeps, botlons, botlats,
                                  botdeps, origin, group_index)
    rrup_e = erup.computeRrup(lon, lat, dep)
    rjb_e = erup.computeRjb(lon, lat, dep)

    # Check that QuadRupture and EdgeRupture give the same result
    # (we check the absolute values of QuadRupture elsewhere)
    np.testing.assert_allclose(rrup_e, rrup_q, atol=0.35)
    np.testing.assert_allclose(rjb_e, rjb_q, atol=0.35)
예제 #8
0
def test_ss3_m4p5():
    magnitude = 4.5
    dip = np.array([90])
    rake = 180.0
    width = np.array([15])
    rupx = np.array([0, 0])
    rupy = np.array([0, 80])
    zp = np.array([0])
    epix = np.array([0])
    epiy = np.array([0.2 * rupy[1]])

    # Convert to lat/lon
    proj = geo.utils.get_orthographic_projection(-122, -120, 39, 37)
    tlon, tlat = proj(rupx, rupy, reverse=True)
    epilon, epilat = proj(epix, epiy, reverse=True)

    # Origin
    origin = Origin({'lat': epilat[0],
                     'lon': epilon[0],
                     'depth': 10,
                     'mag': magnitude,
                     'eventsourcecode': 'ss3',
                     'rake': rake})

    rup = QuadRupture.fromTrace(
        np.array([tlon[0]]), np.array([tlat[0]]),
        np.array([tlon[1]]), np.array([tlat[1]]),
        zp, width, dip, origin, reference='ss3')

    x = np.linspace(0, 20, 6)
    y = np.linspace(0, 90, 11)
    site_x, site_y = np.meshgrid(x, y)
    slon, slat = proj(site_x, site_y, reverse=True)
    deps = np.zeros_like(slon)

    test1 = Bayless2013(origin, rup, slat, slon, deps, T=1.0)

    # Test fd
    fd = test1.getFd()
    fd_test = np.array(
        [[0.,  0.,  0.,  0.,  0.,  0.],
         [0.,  0.,  0.,  0.,  0.,  0.],
            [0.,  0.,  0.,  0.,  0.,  0.],
            [0.,  0.,  0.,  0.,  0.,  0.],
            [0.,  0.,  0.,  0.,  0.,  0.],
            [0.,  0.,  0.,  0.,  0.,  0.],
            [0.,  0.,  0.,  0.,  0.,  0.],
            [0.,  0.,  0.,  0.,  0.,  0.],
            [0.,  0.,  0.,  0.,  0.,  0.],
            [0.,  0.,  0.,  0.,  0.,  0.],
            [0.,  0.,  0.,  0.,  0.,  0.]])
    np.testing.assert_allclose(
        fd, fd_test, rtol=1e-4)
예제 #9
0
def test_EdgeRupture_vs_QuadRupture():
    # Sites stuff
    sites = Sites.fromCenter(-122.15, 37.15, 1.5, 1.5, 0.01, 0.01)
    sm_dict = sites._GeoDict
    west = sm_dict.xmin
    east = sm_dict.xmax
    south = sm_dict.ymin
    north = sm_dict.ymax
    nx = sm_dict.nx
    ny = sm_dict.ny
    lats = np.linspace(north, south, ny)
    lons = np.linspace(west, east, nx)
    lon, lat = np.meshgrid(lons, lats)
    dep = np.zeros_like(lon)

    # Construct QuadRupture
    xp0 = np.array([-122.0, -122.5])
    yp0 = np.array([37.1, 37.4])
    xp1 = np.array([-121.7, -122.3])
    yp1 = np.array([37.2, 37.2])
    zp = np.array([0, 6])
    widths = np.array([30, 20])
    dips = np.array([30, 40])

    origin = Origin({'lat': 0,  'lon': 0, 'depth': 0, 'mag': 7.2, 'eventsourcecode': ''})
    qrup = QuadRupture.fromTrace(xp0, yp0, xp1, yp1, zp, widths, dips, origin)
    rrup_q = qrup.computeRrup(lon, lat, dep)
    rjb_q = qrup.computeRjb(lon, lat, dep)

    # Construct equivalent EdgeRupture
    toplons = np.array([-122.0, -121.7, -122.5, -122.3])
    toplats = np.array([37.1, 37.2, 37.4, 37.2])
    topdeps = np.array([0, 0, 6, 6])
    botlons = np.array([-121.886864, -121.587568, -122.635467, -122.435338])
    botlats = np.array([36.884527, 36.984246, 37.314035,  37.114261])
    botdeps = np.array([15.0000, 14.9998, 18.8558, 18.8559])
    group_index = [0, 0, 1, 1]

    erup = EdgeRupture.fromArrays(
        toplons, toplats, topdeps, botlons, botlats, botdeps,
        origin, group_index)
    rrup_e = erup.computeRrup(lon, lat, dep)
    rjb_e = erup.computeRjb(lon, lat, dep)

    # Check that QuadRupture and EdgeRupture give the same result
    # (we check the absolute values of QuadRupture elsewhere)
    np.testing.assert_allclose(rrup_e, rrup_q, atol=0.35)
    np.testing.assert_allclose(rjb_e, rjb_q, atol=0.35)
예제 #10
0
def test_plot_rupture(interactive=False):
    xp0 = np.array([-90.898000])
    xp1 = np.array([-91.308000])
    yp0 = np.array([12.584000])
    yp1 = np.array([12.832000])
    zp = [0.0]
    strike = azimuth(yp0[0], xp0[0], yp1[0], xp1[0])
    origin = Origin({
        'lat': 0.0,
        'lon': 0.0,
        'depth': 0.0,
        'mag': 5.5,
        'id': '',
        'netid': 'abcd',
        'network': '',
        'locstring': '',
        'time': HistoricTime.utcfromtimestamp(time.time())
    })
    interface_width = MAX_DEPTH / np.sin(np.radians(DIP))
    widths = np.ones(xp0.shape) * interface_width
    dips = np.ones(xp0.shape) * DIP
    strike = [strike]
    rupture = QuadRupture.fromTrace(xp0,
                                    yp0,
                                    xp1,
                                    yp1,
                                    zp,
                                    widths,
                                    dips,
                                    origin,
                                    strike=strike)
    plot_rupture_wire3d(rupture)
    if interactive:
        fname = os.path.join(os.path.expanduser('~'), 'rupture_wire_plot.png')
        plt.savefig(fname)
        print('Wire 3D plot saved to %s.  Delete this file if you wish.' %
              fname)

    # Need to get tests to check exception for if an axis is handed off
    fig = plt.figure()
    ax = fig.add_subplot(111, projection='3d')
    plot_rupture_wire3d(rupture, ax)

    # And raise the exception if it is not a 3d axis
    with pytest.raises(TypeError):
        ax = fig.add_subplot(111)
        plot_rupture_wire3d(rupture, ax)
예제 #11
0
def rupture_from_dict(d):
    """
    Method returns either a Rupture subclass (QuadRupture, EdgeRupture, or
    PointRupture) object based on a GeoJSON dictionary.

    .. seealso::
        :func:`rupture_from_dict_and_origin`

    Args:
        d (dict):
            Rupture GeoJSON dictionary, which must contain origin
            information in the 'metadata' field.

    Returns:
        a Rupture subclass.

    """
    validate_json(d)

    # We don't want to mess with the input just in case it gets used again
    d = copy.deepcopy(d)

    try:
        d['metadata']['time'] = HistoricTime.strptime(d['metadata']['time'],
                                                      constants.TIMEFMT)
    except ValueError:
        d['metadata']['time'] = HistoricTime.strptime(d['metadata']['time'],
                                                      constants.ALT_TIMEFMT)

    origin = Origin(d['metadata'])

    # What type of rupture is this?
    geo_type = d['features'][0]['geometry']['type']
    if geo_type == 'MultiPolygon':
        valid_quads = is_quadrupture_class(d)
        if valid_quads is True:
            rupt = QuadRupture(d, origin)
        elif 'mesh_dx' in d['metadata']:
            # EdgeRupture will have 'mesh_dx' in metadata
            mesh_dx = d['metadata']['mesh_dx']
            rupt = EdgeRupture(d, origin, mesh_dx=mesh_dx)
        else:
            raise ValueError('Invalid rupture dictionary.')
    elif geo_type == 'Point':
        rupt = PointRupture(origin)

    return rupt
예제 #12
0
def rupture_from_dict_and_origin(rupdict, origin, mesh_dx=0.5):
    """
    Method returns either a QuadRupture or EdgeRupture object based on a
    GeoJSON dictionary and an origin. Note that this is very similar to
    :func:`rupture_from_dict`, except that method is for
    constructing the rupture objects from a dict that already contains the
    origin info in the `metadata` field (e.g., from a dict from a Shakemap
    container), while this method is for construction of the rupture objects
    from a GeoJSON dict that does not yet include that information (e.g., from
    a dict that is read in to initially create the shakemap container, along
    with an Origin that is derived from `event.xml`).

    .. seealso:: :func:`rupture_from_dict`

    Args:
        rupdictd (dict):
            Rupture GeoJSON dictionary.
        origin (Origin):
            A ShakeMap origin object.
        mesh_dx (float):
            Target spacing (in km) for rupture discretization;
            default is 0.5 km and it is only used if the rupture file is an
            EdgeRupture.

    Returns:
        a Rupture subclass.

    """
    validate_json(rupdict)

    # Is this a QuadRupture or an EdgeRupture?
    valid_quads = is_quadrupture_class(rupdict)

    if valid_quads is True:
        rupt = QuadRupture(rupdict, origin)
    else:
        if rupdict['features'][0]['geometry']['type'] == 'Point':
            rupt = PointRupture(origin)
        else:
            rupt = EdgeRupture(rupdict, origin, mesh_dx=mesh_dx)

    return rupt
예제 #13
0
def test_slip():
    # Rupture requires an origin even when not used:
    origin = Origin({'eventsourcecode': 'test', 'lat': 0, 'lon': 0,
                     'depth': 5.0, 'mag': 7.0})
    # Make a rupture
    lat0 = np.array([34.1])
    lon0 = np.array([-118.2])
    lat1 = np.array([34.2])
    lon1 = np.array([-118.15])
    z = np.array([1.0])
    W = np.array([3.0])
    dip = np.array([30.])
    rup = QuadRupture.fromTrace(lon0, lat0, lon1, lat1, z, W, dip, origin)

    slp = get_quad_slip(rup.getQuadrilaterals()[0], 30).getArray()
    slpd = np.array([0.80816457,  0.25350787,  0.53160491])
    np.testing.assert_allclose(slp, slpd)

    slp = get_local_unit_slip_vector(22, 30, 86).getArray()
    slpd = np.array([0.82714003,  0.38830563,  0.49878203])
    np.testing.assert_allclose(slp, slpd)
예제 #14
0
def test_plot_rupture(interactive=False):
    xp0 = np.array([-90.898000])
    xp1 = np.array([-91.308000])
    yp0 = np.array([12.584000])
    yp1 = np.array([12.832000])
    zp = [0.0]
    strike = azimuth(yp0[0], xp0[0], yp1[0], xp1[0])
    origin = Origin({
        'lat': 0.0,
        'lon': 0.0,
        'depth': 0.0,
        'mag': 5.5,
        'id': '',
        'netid': 'abcd',
        'network': '',
        'locstring': '',
        'time': HistoricTime.utcfromtimestamp(time.time())
    })
    interface_width = MAX_DEPTH / np.sin(np.radians(DIP))
    widths = np.ones(xp0.shape) * interface_width
    dips = np.ones(xp0.shape) * DIP
    strike = [strike]
    rupture = QuadRupture.fromTrace(xp0,
                                    yp0,
                                    xp1,
                                    yp1,
                                    zp,
                                    widths,
                                    dips,
                                    origin,
                                    strike=strike)
    plot_rupture_wire3d(rupture)
    if interactive:
        fname = os.path.join(os.path.expanduser('~'), 'rupture_wire_plot.png')
        plt.savefig(fname)
        print('Wire 3D plot saved to %s.  Delete this file if you wish.' %
              fname)
예제 #15
0
def test_map_rupture(interactive=False):
    xp0 = np.array([-90.898000])
    xp1 = np.array([-91.308000])
    yp0 = np.array([12.584000])
    yp1 = np.array([12.832000])
    zp = [0.0]
    strike = azimuth(yp0[0], xp0[0], yp1[0], xp1[0])
    origin = Origin({'lat': 0.0,
                     'lon': 0.0,
                     'depth': 0.0,
                     'mag': 5.5,
                     'eventsourcecode': 'abcd'})
    interface_width = MAX_DEPTH / np.sin(np.radians(DIP))
    widths = np.ones(xp0.shape) * interface_width
    dips = np.ones(xp0.shape) * DIP
    strike = [strike]
    rupture = QuadRupture.fromTrace(
        xp0, yp0, xp1, yp1, zp, widths, dips, origin, strike=strike)
    map_rupture(rupture)
    if interactive:
        fname = os.path.join(os.path.expanduser('~'), 'rupture_map.png')
        plt.savefig(fname)
        print('Rupture map plot saved to %s.  Delete this file if you wish.'
              % fname)
예제 #16
0
def test_multisegment_discordant():
    # The one thing that isn't check above is discordancy for segments
    # with multiple quads. For this, we need a synthetic example.
    x0 = np.array([0,   1, -1, 10,   9,  7])
    y0 = np.array([0,  10, 20, 40,  35, 30])
    z0 = np.array([0,   0,  0,  0,   0,  0])
    x1 = np.array([1,  -1,  0,  9,   7,  6])
    y1 = np.array([10, 20, 30, 35,  30, 25])
    z1 = np.array([0,   0,  0,  0,   0,  0])
    x2 = np.array([3,   1,  2,  7,   5,  4])
    y2 = np.array([10, 20, 30, 35,  30, 25])
    z2 = np.array([10, 10, 10, 10,  10, 10])
    x3 = np.array([2,   3,  1,  8,   7,  5])
    y3 = np.array([0,  10, 20, 40,  35, 30])
    z3 = np.array([10, 10, 10, 10,  10, 10])

    epilat = 32.15270
    epilon = -115.30500
    proj = geo.utils.get_orthographic_projection(
        epilon - 1, epilon + 1, epilat + 1, epilat - 1)
    lon0, lat0 = proj(x0, y0, reverse=True)
    lon1, lat1 = proj(x1, y1, reverse=True)
    lon2, lat2 = proj(x2, y2, reverse=True)
    lon3, lat3 = proj(x3, y3, reverse=True)

    # Make an Origin object; most of the 'event' values don't matter for
    # this example
    origin = Origin({'lat': 0,  'lon': 0, 'depth': 0, 'mag': 7.2, 'eventsourcecode': ''})
    rup = QuadRupture.fromVertices(
        lon0, lat0, z0, lon1, lat1, z1, lon2, lat2, z2, lon3, lat3, z3,
        origin, group_index=[0, 0, 0, 1, 1, 1])

    # Sites
    buf = 0.25
    lat = np.linspace(np.nanmin(rup.lats) - buf, np.nanmax(rup.lats) + buf, 20)
    lon = np.linspace(np.nanmin(rup.lons) - buf, np.nanmax(rup.lons) + buf, 20)
    lons, lats = np.meshgrid(lon, lat)
    dep = np.zeros_like(lons)
    x, y = proj(lon, lat)
    rupx, rupy = proj(rup.lons, rup.lats)
    # Calculate U and T
    dtypes = ['U', 'T']
    dists = get_distance(dtypes, lats, lons, dep, rup)

    targetU = np.array(
        [[-28.53228275, -28.36479713, -28.20139732, -28.0407734,
          -27.88135558, -27.72144153, -27.55935946, -27.39362017,
          -27.22300147, -27.04653062, -26.86338215, -26.67275638,
          -26.47381287, -26.26569449, -26.04762427, -25.81902477,
          -25.57961136, -25.32943282, -25.06885791, -24.79852214],
         [-23.53750292, -23.3748086, -23.21793537, -23.06521934,
            -22.91449689, -22.76331684, -22.60928211, -22.45042208,
            -22.28542121, -22.11355532, -21.93435402, -21.74720475,
            -21.55115107, -21.34497916, -21.12749377, -20.89781118,
            -20.6555466, -20.40086149, -20.13439948, -19.85716145],
            [-18.53499939, -18.37689929, -18.22732841, -18.08427516,
             -17.94468687, -17.80472632, -17.66045115, -17.50880802,
             -17.3484421, -17.17963435, -17.0032098, -16.81921732,
             -16.62638972, -16.42258419, -16.20564846, -15.9741218,
             -15.72753538, -15.4663671, -15.19180844, -14.9054813],
            [-13.52283359, -13.36797542, -13.22589288, -13.09466537,
             -12.97028551, -12.84653536, -12.71591089, -12.57212088,
             -12.41335561, -12.24319318, -12.06681006, -11.88598424,
             -11.69798166, -11.49796348, -11.28169605, -11.04691388,
             -10.79343174, -10.52262594, -10.23677602,  -9.93851158],
            [-8.49936685,  -8.34357094,  -8.20650964,  -8.08786858,
             -7.98403171,  -7.88628837,  -7.78005273,  -7.64833307,
             -7.48359988,  -7.29992491,  -7.11862682,  -6.94410189,
             -6.76618701,  -6.5727842,  -6.35634881,  -6.11465447,
             -5.84925708,  -5.56369035,  -5.26212482,  -4.94857454],
            [-3.46638168,  -3.30047216,  -3.15914418,  -3.04618465,
             -2.96252939,  -2.90194067,  -2.84436315,  -2.75029014,
             -2.56983592,  -2.33744275,  -2.1512136,  -1.99833104,
             -1.84066354,  -1.6541107,  -1.43071517,  -1.17252753,
             -0.88592286,  -0.57817222,  -0.25582315,   0.07585567],
            [1.56416954,   1.75393848,   1.9183586,   2.04909316,
             2.13723278,   2.17776584,   2.18272501,   2.20967639,
             2.37405656,   2.65073289,   2.80205222,   2.90973407,
             3.05124404,   3.2505182,   3.50336116,   3.7967575,
             4.11742779,   4.45465822,   4.80070204,   5.15033407],
            [6.5633489,   6.78740885,   6.99419348,   7.17551069,
             7.31963558,   7.4113505,   7.43666779,   7.40177458,
             7.40517136,   7.58520044,   7.62013169,   7.71596777,
             7.90558457,   8.17213015,   8.49008681,   8.83763176,
             9.19937294,   9.56556659,   9.9305469,  10.29132309],
            [11.48996073,  11.74301446,  11.99016964,  12.22782156,
             12.44984059,  12.6446727,  12.78798484,  12.82584849,
             12.61992833,  12.26579742,  12.32166685,  12.54665462,
             12.86628045,  13.23578462,  13.62571822,  14.01882924,
             14.40617707,  14.78388296,  15.15089889,  15.5076165],
            [16.31383216,  16.57376544,  16.83189511,  17.08626411,
             17.33309437,  17.56429108,  17.76005623,  17.85853532,
             17.57101025,  17.32637346,  17.45075419,  17.77199513,
             18.16933168,  18.58284635,  18.9891851,  19.37985879,
             19.75324557,  20.11079653,  20.4549905,  20.78837053],
            [21.03975749,  21.28450315,  21.5243142,  21.75603974,
             21.97469496,  22.17298057,  22.34310053,  22.49668569,
             22.73940191,  22.70030633,  22.95351405,  23.35967832,
             23.75891016,  24.14867803,  24.51536915,  24.85878249,
             25.18398203,  25.49615514,  25.79932964,  26.09638269],
            [25.70484089,  25.92709225,  26.14280395,  26.35119497,
             26.55363501,  26.75827099,  26.9915523,  27.31779086,
             27.77993211,  27.71070831,  28.13624949,  28.723482,
             29.25285078,  29.66404032,  30.00169474,  30.30044315,
             30.57916576,  30.84804427,  31.1126134,  31.37586841],
            [30.35406633,  30.5585145,  30.75843356,  30.95627127,
             31.15811912,  31.3763124,  31.63114968,  31.94156189,
             32.23691802,  32.38759301,  32.86915665,  33.83467935,
             34.46125278,  34.89905345,  35.25111257,  35.55095664,
             35.82150686,  36.07720619,  36.32643896,  36.57385362],
            [35.0222379,  35.21734711,  35.41081942,  35.60589495,
             35.80774808,  36.02313791,  36.25826988,  36.51619168,
             36.81025966,  37.21777129,  37.86674108,  38.66578072,
             39.25203723,  39.78060643,  40.20815617,  40.5606039,
             40.86634527,  41.14457482,  41.40732554,  41.66197722],
            [39.73046099,  39.92514041,  40.12152415,  40.32316112,
             40.5350467,  40.76393316,  41.01937758,  41.3172128,
             41.68596492,  42.16604148,  42.77622755,  43.447503,
             44.03771478,  44.55012468,  45.00551259,  45.40376857,
             45.75505135,  46.07204699,  46.36554362,  46.64361367],
            [44.4876174,  44.68959464,  44.89710008,  45.11420443,
             45.34646809,  45.60143197,  45.88932906,  46.22363997,
             46.61975585,  47.0884227,  47.62307543,  48.1913408,
             48.74937117,  49.26945799,  49.74327902,  50.17123158,
             50.55810895,  50.91098842,  51.23731582,  51.54375617],
            [49.29279265,  49.50696882,  49.73006999,  49.96625305,
             50.22080319,  50.50022572,  50.81209441,  51.1642666,
             51.56290694,  52.00913021,  52.49553006,  53.00565389,
             53.51861282,  54.01614414,  54.48672101,  54.9254339,
             55.33212663,  55.70951516,  56.06170563,  56.39317058],
            [54.13906629,  54.3671694,  54.60643024,  54.86053563,
             55.13377911,  55.43088558,  55.75658576,  56.1148189,
             56.50752978,  56.93329478,  57.38640012,  57.85715119,
             58.33367994,  58.80451404,  59.26065475,  59.69644542,
             60.10938419,  60.49940252,  60.86803179,  61.21767916],
            [59.01741908,  59.25887491,  59.51248349,  59.78119592,
             60.06816694,  60.37651862,  60.70895927,  61.0672529,
             61.45160192,  61.86010542,  62.28853397,  62.73062937,
             63.17894547,  63.62598375,  64.06523791,  64.49185106,
             64.90281064,  65.2967858,  65.67377362,  66.03469546],
            [63.9193099,  64.17236414,  64.4376317,  64.71732366,
             65.01362255,  65.32847988,  65.66334836,  66.0188704,
             66.39457546,  66.7886684,  67.19800022,  67.61828012,
             68.04451487,  68.47157851,  68.89476917,  69.31022713,
             69.71515194,  70.10782673,  70.4875021,  70.85420436]]
    )
    np.testing.assert_allclose(targetU, dists['U'], atol=0.01)
    targetT = np.array(
        [[-2.27427469e+01,  -1.97498544e+01,  -1.67512900e+01,
          -1.37464632e+01,  -1.07350712e+01,  -7.71715083e+00,
          -4.69305811e+00,  -1.66336318e+00,   1.37131605e+00,
          4.41047613e+00,   7.45381136e+00,   1.05011799e+01,
          1.35524779e+01,   1.66074913e+01,   1.96657949e+01,
          2.27267294e+01,   2.57894503e+01,   2.88530154e+01,
          3.19164798e+01,   3.49789747e+01],
         [-2.30778766e+01,  -2.00896906e+01,  -1.70950973e+01,
            -1.40931667e+01,  -1.10834219e+01,  -8.06600712e+00,
            -5.04171582e+00,  -2.01179123e+00,   1.02248614e+00,
          4.06025218e+00,   7.10129626e+00,   1.01459367e+01,
          1.31946312e+01,   1.62475702e+01,   1.93044511e+01,
          2.23644788e+01,   2.54265185e+01,   2.84892997e+01,
          3.15515954e+01,   3.46123426e+01],
            [-2.33971472e+01,  -2.04144525e+01,  -1.74245193e+01,
             -1.44256870e+01,  -1.14169177e+01,  -8.39830615e+00,
             -5.37141115e+00,  -2.33902937e+00,   6.95823925e-01,
             3.73133431e+00,   6.76769593e+00,   9.80663091e+00,
             1.28500821e+01,   1.58991008e+01,   1.89534737e+01,
             2.20119662e+01,   2.50728111e+01,   2.81341606e+01,
             3.11943854e+01,   3.42522163e+01],
            [-2.36965870e+01,  -2.07206976e+01,  -1.77370901e+01,
             -1.47426715e+01,  -1.17347885e+01,  -8.71247709e+00,
             -5.67801094e+00,  -2.63761285e+00,   4.00625914e-01,
             3.43182302e+00,   6.45782532e+00,   9.48491128e+00,
             1.25187545e+01,   1.55616657e+01,   1.86127822e+01,
             2.16694756e+01,   2.47286680e+01,   2.77876297e+01,
             3.08443066e+01,   3.38973527e+01],
            [-2.39698399e+01,  -2.10022612e+01,  -1.80281475e+01,
             -1.50423801e+01,  -1.20388157e+01,  -9.01204040e+00,
             -5.96160398e+00,  -2.89867328e+00,   1.52194374e-01,
             3.17268218e+00,   6.17334725e+00,   9.17699572e+00,
             1.21964990e+01,   1.52330975e+01,   1.82821226e+01,
             2.13375815e+01,   2.43943933e+01,   2.74490375e+01,
             3.04994435e+01,   3.35446330e+01],
            [-2.42070742e+01,  -2.12471979e+01,  -1.82855675e+01,
             -1.53163304e+01,  -1.23296744e+01,  -9.31127857e+00,
             -6.24535210e+00,  -3.12882361e+00,  -2.24460581e-02,
             2.95354485e+00,   5.89215412e+00,   8.86387424e+00,
             1.18748249e+01,   1.49128245e+01,   1.79640055e+01,
             2.10182501e+01,   2.40696313e+01,   2.71153177e+01,
             3.01543919e+01,   3.31869788e+01],
            [-2.43971375e+01,  -2.14368866e+01,  -1.84826148e+01,
             -1.55321207e+01,  -1.25786621e+01,  -9.60654678e+00,
             -6.58612151e+00,  -3.48118311e+00,  -3.16555025e-01,
             2.61618307e+00,   5.53740540e+00,   8.52666510e+00,
             1.15623361e+01,   1.46149780e+01,   1.76674294e+01,
             2.07125025e+01,   2.37483764e+01,   2.67756033e+01,
             2.97955606e+01,   3.28097430e+01],
            [-2.45384925e+01,  -2.15583842e+01,  -1.85874288e+01,
             -1.56290738e+01,  -1.26867853e+01,  -9.76140655e+00,
             -6.84407754e+00,  -3.90089971e+00,  -8.41806596e-01,
             2.14754495e+00,   5.18583472e+00,   8.26271822e+00,
             1.13266091e+01,   1.43684333e+01,   1.73916223e+01,
             2.04017469e+01,   2.34034936e+01,   2.64002111e+01,
             2.93941282e+01,   3.23866586e+01],
            [-2.46576775e+01,  -2.16355610e+01,  -1.86129545e+01,
             -1.55919156e+01,  -1.25763765e+01,  -9.57306672e+00,
             -6.59044329e+00,  -3.62352541e+00,  -5.92041388e-01,
             2.33255341e+00,   5.29498494e+00,   8.24834463e+00,
             1.11833819e+01,   1.41167617e+01,   1.70571082e+01,
             2.00065102e+01,   2.29645946e+01,   2.59302937e+01,
             2.89023967e+01,   3.18797332e+01],
            [-2.48161623e+01,  -2.17489533e+01,  -1.86651328e+01,
             -1.55589864e+01,  -1.24224388e+01,  -9.24466730e+00,
             -6.01521475e+00,  -2.75148770e+00,   3.89519039e-01,
             2.99589525e+00,   5.45696689e+00,   8.01247078e+00,
             1.07291540e+01,   1.35565782e+01,   1.64461360e+01,
             1.93723515e+01,   2.23222250e+01,   2.52881249e+01,
             2.82650171e+01,   3.12494172e+01],
            [-2.50857405e+01,  -2.20002811e+01,  -1.88926336e+01,
             -1.57550887e+01,  -1.25770789e+01,  -9.34497451e+00,
             -6.04430316e+00,  -2.67290100e+00,   5.40854953e-01,
             2.30509492e+00,   3.58183843e+00,   6.23701436e+00,
             9.28727128e+00,   1.23205706e+01,   1.53428945e+01,
             1.83666035e+01,   2.13934954e+01,   2.44218171e+01,
             2.74496472e+01,   3.04757209e+01],
            [-2.55082697e+01,  -2.24454912e+01,  -1.93710045e+01,
             -1.62824768e+01,  -1.31767102e+01,  -1.00469827e+01,
             -6.86985653e+00,  -3.54681638e+00,   1.07062999e-01,
             3.34891657e-01,  -1.70694750e-01,   3.57896940e+00,
             7.17013928e+00,   1.05232789e+01,   1.37976070e+01,
             1.70230221e+01,   2.02076136e+01,   2.33576919e+01,
             2.64794914e+01,   2.95785985e+01],
            [-2.60778515e+01,  -2.30695744e+01,  -2.00684150e+01,
             -1.70790651e+01,  -1.41074315e+01,  -1.11587507e+01,
             -8.23273307e+00,  -5.33306966e+00,  -2.80144302e+00,
             -1.84760416e+00,  -1.05368779e+00,   1.26163211e+00,
             4.90086292e+00,   8.53883059e+00,   1.20996577e+01,
             1.55589098e+01,   1.89237978e+01,   2.22114952e+01,
             2.54390313e+01,   2.86203790e+01],
            [-2.67537229e+01,  -2.38123298e+01,  -2.08964272e+01,
             -1.80168638e+01,  -1.51896230e+01,  -1.24401995e+01,
             -9.81536176e+00,  -7.41008520e+00,  -5.38073414e+00,
             -3.78262975e+00,  -2.29669890e+00,  -3.53057240e-01,
             3.13642477e+00,   6.97021789e+00,   1.07026969e+01,
             1.42945488e+01,   1.77655640e+01,   2.11406146e+01,
             2.44409375e+01,   2.76832489e+01],
            [-2.74832153e+01,  -2.46028623e+01,  -2.17593854e+01,
             -1.89653378e+01,  -1.62381218e+01,  -1.36022404e+01,
             -1.10914555e+01,  -8.74572618e+00,  -6.58963863e+00,
             -4.58336507e+00,  -2.57607747e+00,  -2.67233150e-01,
             2.82788692e+00,   6.36737407e+00,   9.93334021e+00,
             1.34440609e+01,   1.68846862e+01,   2.02577163e+01,
             2.35710668e+01,   2.68337230e+01],
            [-2.82199728e+01,  -2.53838486e+01,  -2.25869234e+01,
             -1.98388981e+01,  -1.71512612e+01,  -1.45365893e+01,
             -1.20059297e+01,  -9.56220853e+00,  -7.18799023e+00,
             -4.83006994e+00,  -2.39120744e+00,   2.51308627e-01,
             3.17331949e+00,   6.33022626e+00,   9.61428455e+00,
             1.29426788e+01,   1.62705993e+01,   1.95770961e+01,
             2.28539081e+01,   2.60992146e+01],
            [-2.89332200e+01,  -2.61222251e+01,  -2.33461951e+01,
             -2.06105222e+01,  -1.79200485e+01,  -1.52776479e+01,
             -1.26817390e+01,  -1.01225741e+01,  -7.57801870e+00,
             -5.01122873e+00,  -2.37434916e+00,   3.78303328e-01,
             3.27093827e+00,   6.29527723e+00,   9.41912399e+00,
             1.26046423e+01,   1.58204753e+01,   1.90448689e+01,
             2.22643265e+01,   2.54712657e+01],
            [-2.96082809e+01,  -2.68067500e+01,  -2.40331802e+01,
             -2.12894659e+01,  -1.85760763e+01,  -1.58910124e+01,
             -1.32284735e+01,  -1.05774862e+01,  -7.92111801e+00,
             -5.23724922e+00,  -2.50179068e+00,   3.05790568e-01,
             3.19666197e+00,   6.16975035e+00,   9.21353475e+00,
             1.23109519e+01,   1.54443017e+01,   1.85982825e+01,
             2.17611016e+01,   2.49243957e+01],
            [-3.02420504e+01,  -2.74395034e+01,  -2.46578094e+01,
             -2.18967353e+01,  -1.91546206e+01,  -1.64278219e+01,
             -1.37101816e+01,  -1.09927140e+01,  -8.26378719e+00,
             -5.51007519e+00,  -2.71836365e+00,   1.22111758e-01,
             3.01754598e+00,   5.96851903e+00,   8.97043180e+00,
             1.20150997e+01,   1.50927299e+01,   1.81935916e+01,
             2.13090724e+01,   2.44321477e+01],
            [-3.08377073e+01,  -2.80281994e+01,  -2.52335334e+01,
             -2.24524366e+01,  -1.96825082e+01,  -1.69199811e+01,
             -1.41595768e+01,  -1.13945492e+01,  -8.61701306e+00,
             -5.81861191e+00,  -2.99148017e+00,  -1.29317230e-01,
             2.77170749e+00,   5.71249079e+00,   8.69110042e+00,
             1.17033684e+01,   1.47437429e+01,   1.78061436e+01,
             2.08846464e+01,   2.39739290e+01]]
    )
    np.testing.assert_allclose(targetT, dists['T'], atol=0.01)
예제 #17
0
def test_rupture_depth(interactive=False):
    DIP = 17.0
    WIDTH = 20.0
    GRIDRES = 0.1

    names = ['single', 'double', 'triple',
             'concave', 'concave_simple', 'ANrvSA']
    means = [3.1554422780092461, 2.9224454569459781,
             3.0381968625073563, 2.0522694624400271,
             2.4805390352818755, 2.8740121776209673]
    stds = [2.1895293825074575, 2.0506459673526174,
            2.0244588429154402, 2.0112565876976416,
            2.1599789955270019, 1.6156220309120068]
    xp0list = [np.array([118.3]),
               np.array([10.1, 10.1]),
               np.array([10.1, 10.1, 10.3]),
               np.array([10.9, 10.5, 10.9]),
               np.array([10.9, 10.6]),
               np.array([-76.483, -76.626, -76.757, -76.99, -77.024, -76.925,
                         -76.65, -76.321, -75.997, -75.958])]
    xp1list = [np.array([118.3]),
               np.array([10.1, 10.3]),
               np.array([10.1, 10.3, 10.1]),
               np.array([10.5, 10.9, 11.3]),
               np.array([10.6, 10.9]),
               np.array([-76.626, -76.757, -76.99, -77.024, -76.925, -76.65,
                         -76.321, -75.997, -75.958, -76.006])]
    yp0list = [np.array([34.2]),
               np.array([34.2, 34.5]),
               np.array([34.2, 34.5, 34.8]),
               np.array([34.2, 34.5, 34.8]),
               np.array([35.1, 35.2]),
               np.array([-52.068, -51.377, -50.729, -49.845, -49.192, -48.507,
                         -47.875, -47.478, -47.08, -46.422])]
    yp1list = [np.array([34.5]),
               np.array([34.5, 34.8]),
               np.array([34.5, 34.8, 35.1]),
               np.array([34.5, 34.8, 34.6]),
               np.array([35.2, 35.4]),
               np.array([-51.377, -50.729, -49.845, -49.192, -48.507, -47.875,
                         -47.478, -47.08, -46.422, -45.659])]

    for i in range(0, len(xp0list)):
        xp0 = xp0list[i]
        xp1 = xp1list[i]
        yp0 = yp0list[i]
        yp1 = yp1list[i]
        name = names[i]
        mean_value = means[i]
        std_value = stds[i]

        zp = np.zeros(xp0.shape)
        strike = azimuth(xp0[0], yp0[0], xp1[-1], yp1[-1])
        widths = np.ones(xp0.shape) * WIDTH
        dips = np.ones(xp0.shape) * DIP
        strike = [strike]

    origin = Origin({'id': 'test',
                     'lon': 0, 'lat': 0,
                     'depth': 5.0, 'mag': 7.0, 'netid': 'us',
                     'network': '', 'locstring': '',
                     'time': HistoricTime.utcfromtimestamp(time.time())})

    rupture = QuadRupture.fromTrace(
        xp0, yp0, xp1, yp1, zp, widths, dips, origin, strike=strike)

    # make a grid of points over both quads, ask for depths
    ymin = np.nanmin(rupture.lats)
    ymax = np.nanmax(rupture.lats)
    xmin = np.nanmin(rupture.lons)
    xmax = np.nanmax(rupture.lons)

    xmin = np.floor(xmin * (1 / GRIDRES)) / (1 / GRIDRES)
    xmax = np.ceil(xmax * (1 / GRIDRES)) / (1 / GRIDRES)
    ymin = np.floor(ymin * (1 / GRIDRES)) / (1 / GRIDRES)
    ymax = np.ceil(ymax * (1 / GRIDRES)) / (1 / GRIDRES)
    geodict = GeoDict.createDictFromBox(
        xmin, xmax, ymin, ymax, GRIDRES, GRIDRES)
    nx = geodict.nx
    ny = geodict.ny
    depths = np.zeros((ny, nx))
    for row in range(0, ny):
        for col in range(0, nx):
            lat, lon = geodict.getLatLon(row, col)
            depth = rupture.getDepthAtPoint(lat, lon)
            depths[row, col] = depth

    np.testing.assert_almost_equal(np.nanmean(depths), mean_value)
    np.testing.assert_almost_equal(np.nanstd(depths), std_value)

    if interactive:
        fig, axes = plt.subplots(nrows=2, ncols=1)
        ax1, ax2 = axes
        xdata = np.append(xp0, xp1[-1])
        ydata = np.append(yp0, yp1[-1])
        plt.sca(ax1)
        plt.plot(xdata, ydata, 'b')
        plt.sca(ax2)
        im = plt.imshow(depths, cmap='viridis_r')  # noqa
        ch = plt.colorbar()  # noqa
        fname = os.path.join(os.path.expanduser('~'),
                             'quad_%s_test.png' % name)
        print('Saving image for %s quad test... %s' % (name, fname))
        plt.savefig(fname)
        plt.close()
예제 #18
0
def test_EdgeRupture():

    # Rupture requires an origin even when not used:
    origin = Origin({'id': 'test',
                     'lon': 0, 'lat': 0,
                     'depth': 5.0, 'mag': 7.0, 'netid': 'us',
                     'network': '', 'locstring': '',
                     'time': HistoricTime.utcfromtimestamp(time.time())})

    file = os.path.join(homedir, 'rupture_data/cascadia.json')
    rup = get_rupture(origin, file)
    np.testing.assert_allclose(rup.getArea(), 105635.92827547337)

    # Force read Northridge as EdgeRupture
    file = os.path.join(homedir, 'rupture_data/northridge_fault.txt')
    d = text_to_json(file, new_format=True)
    rupt = EdgeRupture(d, origin)
    strike = rupt.getStrike()
    np.testing.assert_allclose(strike, 121.97, atol=0.01)
    dip = rupt.getDip()
    np.testing.assert_allclose(dip, 40.12, atol=0.01)
    L = rupt.getLength()
    np.testing.assert_allclose(L, 17.99, atol=0.01)
    W = rupt.getWidth()
    np.testing.assert_allclose(W, 23.92, atol=0.01)
    ztor = rupt.getDepthToTop()
    np.testing.assert_allclose(ztor, 5, atol=0.01)

    # And again for the same vertices but reversed order
    file = os.path.join(homedir, 'rupture_data/northridge_fixed_fault.txt')
    d = text_to_json(file, new_format=True)
    rupt = EdgeRupture(d, origin)
    strike = rupt.getStrike()
    np.testing.assert_allclose(strike, 121.97, atol=0.01)
    dip = rupt.getDip()
    np.testing.assert_allclose(dip, 40.12, atol=0.01)
    L = rupt.getLength()
    np.testing.assert_allclose(L, 17.99, atol=0.01)
    W = rupt.getWidth()
    np.testing.assert_allclose(W, 23.92, atol=0.01)
    ztor = rupt.getDepthToTop()
    np.testing.assert_allclose(ztor, 5, atol=0.01)

    # Test for fromArrays method
    toplats = np.array([37.0, 38.0])
    toplons = np.array([-120.0, -120.0])
    topdeps = np.array([0.0, 0.0])
    botlats = copy.copy(toplats)
    botlons = copy.copy(toplons)
    botdeps = np.array([10.0, 10.0])
    erup = EdgeRupture.fromArrays(toplons, toplats, topdeps, botlons, botlats,
                                  botdeps, origin)
    # Error: array lengths differ
    with pytest.raises(ShakeLibException) as e:
        qrup = QuadRupture.fromVertices(
            [toplons[0]], [toplats[0]], [topdeps[0]],
            [toplons[1]], [toplats[1]], [topdeps[1]],
            [botlons[1]], [botlats[1]], [botdeps[1]],
            [botlons[0]], [botlats[0]], [botdeps[0]][:-1],
            origin)
    print(str(e))

    # Error: group index too long
    with pytest.raises(ShakeLibException) as e:
        qrup = QuadRupture.fromVertices(
            [toplons[0]], [toplats[0]], [topdeps[0]],
            [toplons[1]], [toplats[1]], [topdeps[1]],
            [botlons[1]], [botlats[1]], [botdeps[1]],
            [botlons[0]], [botlats[0]], [botdeps[0]],
            origin, group_index=[0, 0, 0, 0, 0, 0])
    print(str(e))

    qrup = QuadRupture.fromVertices(
        [toplons[0]], [toplats[0]], [topdeps[0]],
        [toplons[1]], [toplats[1]], [topdeps[1]],
        [botlons[1]], [botlats[1]], [botdeps[1]],
        [botlons[0]], [botlats[0]], [botdeps[0]],
        origin)
    np.testing.assert_allclose(erup.getArea(), 1108.9414759967776)
    np.testing.assert_allclose(erup.getDepthToTop(), 0)
    np.testing.assert_allclose(erup.getLength(), 111.19492664455889)
    np.testing.assert_allclose(
        erup.lats, np.array([37.,  38.,  38.,  37.,  37.,  np.nan]))
    np.testing.assert_allclose(
        erup.lons, np.array([-120., -120., -120., -120., -120.,  np.nan]))
    np.testing.assert_allclose(
        erup.depths, np.array([0.,   0.,  10.,  10.,   0.,  np.nan]))
    np.testing.assert_allclose(
        erup._getGroupIndex(), np.array([0.,   0.]))
    quads = erup.getQuadrilaterals()
    np.testing.assert_allclose(quads[0][0].x, -120.0)

    # Need to also test the distances with EdgeRupture
    lons = np.linspace(-120.1, -121.0, 10)
    lats = np.linspace(37.0, 38, 10)
    deps = np.zeros_like(lons)
    rrup1, _ = qrup.computeRrup(lons, lats, deps)
    rrup2, _ = erup.computeRrup(lons, lats, deps)
    np.testing.assert_allclose(rrup1, rrup2, atol=2e-2)
    rjb1, _ = qrup.computeRjb(lons, lats, deps)
    rjb2, _ = erup.computeRjb(lons, lats, deps)
    np.testing.assert_allclose(rjb1, rjb2, atol=2e-2)
    gc2 = erup.computeGC2(lons, lats, deps)
    targetRy0 = np.array(
        [0., 0.,  0., 0.,  0.,
         0., 0.,  0., 0.,  0.67335931])
    targetRx = np.array(
        [-8.88024949, -17.73390996, -26.56167797, -35.3634266,
         -44.13902929, -52.88835984, -61.61129242, -70.30770154,
         -78.97746209, -87.6204493])
    np.testing.assert_allclose(gc2['ry0'], targetRy0)
    np.testing.assert_allclose(gc2['rx'], targetRx)
예제 #19
0
def test_fromOrientation():
    py = [0, 0.5]
    px = [0, 0.5]
    pz = [10, 20]
    dx = [5, 7]
    dy = [8, 5]
    width = [10, 40]
    length = [20, 50]
    strike = [0, 90]
    dip = [30, 20]

    # Rupture requires an origin even when not used:
    origin = Origin({'id': 'test',
                     'lon': 0, 'lat': 0,
                     'depth': 5.0, 'mag': 7.0, 'netid': 'us',
                     'network': '', 'locstring': '',
                     'time': HistoricTime.utcfromtimestamp(time.time())})
    rupture = QuadRupture.fromOrientation(px, py, pz, dx, dy, length, width,
                                          strike, dip, origin)
    p1 = rupture._geojson['features'][0]['geometry']['coordinates'][0][0][0]
    p2 = rupture._geojson['features'][0]['geometry']['coordinates'][0][0][1]
    p3 = rupture._geojson['features'][0]['geometry']['coordinates'][0][0][2]
    p4 = rupture._geojson['features'][0]['geometry']['coordinates'][0][0][3]
    p5 = rupture._geojson['features'][0]['geometry']['coordinates'][0][1][0]
    p6 = rupture._geojson['features'][0]['geometry']['coordinates'][0][1][1]
    p7 = rupture._geojson['features'][0]['geometry']['coordinates'][0][1][2]
    p8 = rupture._geojson['features'][0]['geometry']['coordinates'][0][1][3]

    # Check depths
    np.testing.assert_allclose(p1[2], 6)
    np.testing.assert_allclose(p2[2], 6)
    np.testing.assert_allclose(p3[2], 11)
    np.testing.assert_allclose(p4[2], 11)
    np.testing.assert_allclose(p5[2], 18.2898992834)
    np.testing.assert_allclose(p6[2], 18.2898992834)
    np.testing.assert_allclose(p7[2], 31.9707050164)
    np.testing.assert_allclose(p8[2], 31.9707050164)

    # Exception raised if no origin
    with pytest.raises(Exception) as a:
        rupture = QuadRupture.fromOrientation(px, py, pz, dx, dy, length,
                                              width, strike, dip, None)
    print(str(a))

    # Exception raised if different lengths of arrays
    with pytest.raises(Exception) as a:
        py = [0, 2]
        px = [0]
        pz = [10]
        dx = [5]
        dy = [8]
        width = [10]
        length = [20]
        strike = [0]
        dip = [30]

        origin = Origin({'id': 'test',
                         'lon': 0, 'lat': 0,
                         'depth': 5.0, 'mag': 7.0, 'netid': 'us',
                         'network': '', 'locstring': '',
                         'time': HistoricTime.utcfromtimestamp(time.time())})
        rupture = QuadRupture.fromOrientation(px, py, pz, dx, dy, length,
                                              width, strike, dip, origin)
    print(str(a))
예제 #20
0
def test_fromTrace():
    xp0 = [0.0]
    xp1 = [0.0]
    yp0 = [0.0]
    yp1 = [0.05]
    zp = [0.0]
    widths = [10.0]
    dips = [45.0]

    # Rupture requires an origin even when not used:
    origin = Origin({
        'id': 'test',
        'lon': -121.81529, 'lat': 37.73707,
        'depth': 5.0, 'mag': 7.0, 'netid': 'us',
        'network': '', 'locstring': '',
        'time': HistoricTime.utcfromtimestamp(time.time())
    })

    # Error: unequal array lengths
    with pytest.raises(ShakeLibException) as e:
        rupture = QuadRupture.fromTrace(
            xp0, yp0, xp1, yp1, zp[:-1], widths,
            dips, origin,
            reference='From J Smith, (personal communication)')
    print(str(e))

    # Error: invalid strike
    with pytest.raises(ShakeLibException) as e:
        rupture = QuadRupture.fromTrace(
            xp0, yp0, xp1, yp1, zp, widths,
            dips, origin, strike=[236.0, 250.0],
            reference='From J Smith, (personal communication)')
    print(str(e))

    # TODO: These write tests exercise code, but we don't check the results
    rupture = QuadRupture.fromTrace(
        xp0, yp0, xp1, yp1, zp, widths,
        dips, origin,
        reference='From J Smith, (personal communication)')
    fstr = io.StringIO()
    rupture.writeTextFile(fstr)

    tfile = tempfile.NamedTemporaryFile()
    tname = tfile.name
    tfile.close()
    rupture.writeTextFile(tname)
    os.remove(tname)

    tfile = tempfile.NamedTemporaryFile()
    tname = tfile.name
    tfile.close()
    rupture.writeGeoJson(tname)
    os.remove(tname)

    xp0 = [-121.81529, -121.82298]
    xp1 = [-121.82298, -121.83068]
    yp0 = [37.73707, 37.74233]
    yp1 = [37.74233, 37.74758]
    zp = [10, 15]
    widths = [15.0, 20.0]
    dips = [30.0, 45.0]
    rupture = QuadRupture.fromTrace(
        xp0, yp0, xp1, yp1, zp, widths,
        dips, origin,
        reference='From J Smith, (personal communication)')

    assert rupture.getReference() == 'From J Smith, (personal communication)'
    rorigin = rupture.getOrigin()
    assert rorigin.id == origin.id
    assert rorigin.mag == origin.mag
    assert rorigin.depth == origin.depth

    rx = rupture.getRuptureContext([])
    np.testing.assert_allclose([rx.strike, rx.dip, rx.ztor, rx.width],
                               [-49.183708644954905, 37.638322472702534,
                                9.999999999371358, 17.47024205615428])

    rhyp = rupture.computeRhyp(np.array([-121.5]), np.array([37.0]),
                               np.array([0]))
    repi = rupture.computeRepi(np.array([-121.5]), np.array([37.0]),
                               np.array([0]))
    np.testing.assert_allclose([rhyp[0], repi[0]], [86.709236, 86.564956])
def parse_bssc2014_ucerf(rupts, args):
    """
    This function is to parse the UCERF3 json file format. The ruptures in
    UCERF3 are very complex and so we don't exepct to get other rupture lists
    in this format.

    Args:
        rupts (dict): Python translation of rupture json file using json.load
            method.
        args (ArgumentParser): argparse object.

    Returns:
        dict: Dictionary of rupture information.

    """
    rlist = []
    nrup = len(rupts['events'])

    if args.index is not None:
        iter = args.index
        iter = map(int, iter)
    else:
        iter = range(nrup)

    for i in iter:
        event_name = rupts['events'][i]['name']
        short_name = event_name.split('EllB')[0].split('Shaw09')[0].split(
            '2011')[0].split('HB08')[0].rstrip()
        magnitude = rupts['events'][i]['magnitude']
        rake = rupts['events'][i]['rake']

        sections = np.array(rupts['events'][i]['sections'])
        nsections = len(sections)

        secind = 0
        new_seg_ind = []
        rev = np.array([[]])
        xp0 = np.array([[]])
        xp1 = np.array([[]])
        yp0 = np.array([[]])
        yp1 = np.array([[]])
        zp = np.array([[]])
        dip_sec = np.array([[]])
        strike_sec = np.array([[]])
        width_sec = np.array([[]])
        for j in range(0, nsections):
            trace_sec = np.array(sections[j]['resampledTrace'])
            top_sec_lon = trace_sec[:, 0]
            top_sec_lat = trace_sec[:, 1]
            top_sec_z = trace_sec[:, 2]
            n_sec_trace = len(trace_sec) - 1
            dip_sec = np.append(dip_sec,
                                np.repeat(sections[j]['dip'], n_sec_trace))
            dipDir_sec = np.repeat(sections[j]['dipDir'], n_sec_trace)
            strike_sec = np.append(strike_sec, dipDir_sec - 90)
            width_sec = np.append(width_sec,
                                  np.repeat(sections[j]['width'], n_sec_trace))
            rev_sec = sections[j]['reversed']
            rev = np.append(rev, np.repeat(rev_sec, n_sec_trace))
            xp0_sec = top_sec_lon[range(0, n_sec_trace)]
            xp1_sec = top_sec_lon[range(1, n_sec_trace + 1)]
            yp0_sec = top_sec_lat[range(0, n_sec_trace)]
            yp1_sec = top_sec_lat[range(1, n_sec_trace + 1)]
            zp_sec = top_sec_z[range(0, n_sec_trace)]
            if rev_sec is False:
                xp0 = np.append(xp0, xp0_sec)
                xp1 = np.append(xp1, xp1_sec)
                yp0 = np.append(yp0, yp0_sec)
                yp1 = np.append(yp1, yp1_sec)
                zp = np.append(zp, zp_sec)
            else:
                xp0 = np.append(xp0, xp1_sec[::-1])
                xp1 = np.append(xp1, xp0_sec[::-1])
                yp0 = np.append(yp0, yp1_sec[::-1])
                yp1 = np.append(yp1, yp0_sec[::-1])
                zp = np.append(zp, zp_sec[::-1])
            new_seg_ind.extend([secind] * n_sec_trace)
            secind = secind + 1

        # Origin
        origin = Origin({'mag': 0, 'id': '', 'lat': 0, 'lon': 0, 'depth': 0})
        rupt = QuadRupture.fromTrace(xp0,
                                     yp0,
                                     xp1,
                                     yp1,
                                     zp,
                                     width_sec,
                                     dip_sec,
                                     origin,
                                     strike=strike_sec,
                                     group_index=new_seg_ind,
                                     reference=args.reference)

        quads = rupt.getQuadrilaterals()
        edges = get_rupture_edges(quads, rev)
        hlat, hlon, hdepth = get_hypo(edges, args)

        id_str, eventsourcecode, real_desc = get_event_id(
            event_name, magnitude, args.directivity, args.dirind, quads)

        event = {
            'lat': hlat,
            'lon': hlon,
            'depth': hdepth,
            'mag': magnitude,
            'rake': rake,
            'id': id_str,
            'locstring': event_name,
            'type': 'ALL',
            'timezone': 'UTC',
            'time': ShakeDateTime.utcfromtimestamp(int(time.time())),
            'created': ShakeDateTime.utcfromtimestamp(int(time.time()))
        }

        # Update rupture with new origin info
        origin = Origin(event)
        rupt = QuadRupture.fromTrace(xp0,
                                     yp0,
                                     xp1,
                                     yp1,
                                     zp,
                                     width_sec,
                                     dip_sec,
                                     origin,
                                     strike=strike_sec,
                                     group_index=new_seg_ind,
                                     reference=args.reference)

        rdict = {
            'rupture': rupt,
            'event': event,
            'edges': edges,
            'id_str': id_str,
            'short_name': short_name,
            'real_desc': real_desc,
            'eventsourcecode': eventsourcecode
        }

        rlist.append(rdict)

    return rlist
예제 #22
0
def test_rv4():
    magnitude = 7.0
    rake = 90.0
    width = np.array([28])
    rupx = np.array([0, 0])
    rupy = np.array([0, 32])
    zp = np.array([0])
    dip = np.array([30])

    # Convert to lat/lon
    proj = geo.utils.get_orthographic_projection(-122, -120, 39, 37)
    tlon, tlat = proj(rupx, rupy, reverse=True)

    # Dummy Origin
    origin = Origin({'lat': 0,
                     'lon': 0,
                     'depth': 0,
                     'mag': 0,
                     'eventsourcecode': 'rv4',
                     'rake': rake})

    # Rupture
    rup = QuadRupture.fromTrace(
        np.array([tlon[0]]), np.array([tlat[0]]),
        np.array([tlon[1]]), np.array([tlat[1]]),
        zp, width, dip, origin, reference='')
    L = rup.getLength()

    # Figure out epicenter
    tmp = rup.getQuadrilaterals()[0]
    pp0 = Vector.fromPoint(point.Point(
        tmp[0].longitude, tmp[0].latitude, tmp[0].depth))
    pp1 = Vector.fromPoint(point.Point(
        tmp[1].longitude, tmp[1].latitude, tmp[1].depth))
    pp2 = Vector.fromPoint(point.Point(
        tmp[2].longitude, tmp[2].latitude, tmp[2].depth))
    pp3 = Vector.fromPoint(point.Point(
        tmp[3].longitude, tmp[3].latitude, tmp[3].depth))
    dxp = 6 / L
    dyp = (width - 8) / width
    mp0 = pp0 + (pp1 - pp0) * dxp
    mp1 = pp3 + (pp2 - pp3) * dxp
    rp = mp0 + (mp1 - mp0) * dyp
    epilat, epilon, epidepth = ecef2latlon(rp.x, rp.y, rp.z)

    # Fix Origin:
    origin = Origin({'lat': epilat,
                     'lon': epilon,
                     'depth': epidepth,
                     'mag': magnitude,
                     'eventsourcecode': 'rv4',
                     'rake': rake})

    x = np.linspace(-50, 50, 11)
    y = np.linspace(-50, 50, 11)
    site_x, site_y = np.meshgrid(x, y)
    slon, slat = proj(site_x, site_y, reverse=True)
    deps = np.zeros_like(slon)

    test1 = Bayless2013(origin, rup, slat, slon, deps, T=2.0)

    # Test fd
    fd = test1.getFd()
    fd_test = np.array(
        [[0.00000000e+00,   0.00000000e+00,   0.00000000e+00,
          1.72143257e-03,   1.34977260e-03,   4.33616224e-15,
          1.24446253e-03,   1.16142357e-03,   2.25464716e-03,
          7.05281751e-04,   0.00000000e+00],
         [0.00000000e+00,   0.00000000e+00,   7.62610242e-03,
          1.25133844e-02,   5.61896104e-03,   7.63126014e-15,
          4.52266194e-03,   4.67970900e-03,   1.02820316e-02,
          5.13160096e-03,  -6.13926251e-03],
            [0.00000000e+00,   4.00495234e-03,   2.37608386e-02,
             2.37139333e-02,   9.55224050e-03,   5.66364910e-15,
             7.70344813e-03,   7.36466362e-03,   1.48239704e-02,
             8.40388145e-03,  -1.58592485e-02],
            [8.08385547e-19,   9.38150101e-03,   3.38610620e-02,
             3.85351492e-02,   1.91044918e-02,   3.98697802e-15,
             1.54321666e-02,   1.21913760e-02,   2.04435166e-02,
             1.04931859e-02,  -1.85935894e-02],
            [2.12025421e-18,   1.37316085e-02,   4.40193799e-02,
             6.16562477e-02,   4.77612496e-02,   2.60257085e-15,
             3.86322888e-02,   1.97965887e-02,   2.64882038e-02,
             1.23335908e-02,  -2.07389932e-02],
            [2.64338576e-18,   1.45898292e-02,   4.89104213e-02,
             7.70703166e-02,   9.55225258e-02,   1.01875104e-01,
             7.73459329e-02,   2.50275508e-02,   2.93537540e-02,
             1.30949577e-02,  -2.15685454e-02],
            [2.64330042e-18,   1.45898262e-02,   4.89104186e-02,
             7.70703146e-02,   9.55225248e-02,   1.01910945e-01,
             7.74050835e-02,   2.52307946e-02,   2.92970736e-02,
             1.30880504e-02,  -2.15685424e-02],
            [2.64318867e-18,   1.45898259e-02,   4.89104184e-02,
             7.70703144e-02,   9.55225247e-02,   1.01933432e-01,
             7.74421258e-02,   2.53572923e-02,   2.92615130e-02,
             1.30837284e-02,  -2.15685422e-02],
            [2.64305117e-18,   1.45898284e-02,   4.89104206e-02,
             7.70703161e-02,   9.55225256e-02,   1.01942593e-01,
             7.74571359e-02,   2.54081640e-02,   2.92472117e-02,
             1.30819985e-02,  -2.15685446e-02],
            [2.30141673e-18,   1.40210825e-02,   4.56205547e-02,
             6.63109661e-02,   5.79266964e-02,   2.33044622e-15,
             4.69672564e-02,   2.18401553e-02,   2.72864925e-02,
             1.25728575e-02,  -2.10227772e-02],
            [1.10672535e-18,   1.04777076e-02,   3.59041065e-02,
             4.24614318e-02,   2.24217216e-02,   3.66914762e-15,
             1.81728517e-02,   1.39301504e-02,   2.14956836e-02,
             1.08711460e-02,  -1.90802849e-02]]
    )
    np.testing.assert_allclose(fd, fd_test, rtol=2e-4)
def parse_json_nshmp(rupts, args):
    """
    This will hopefully be the most general json format for rutpures.
    Assumes top of ruputure is horizontal and continuous, and that
    there is only one segment per rupture (but multiple quads).
    Users first and last point to get average strike, which is used
    for all quads.

    Args:
        rupts (dict): Python translation of rupture json file using json.load
            method.
        args (ArgumentParser): argparse object.

    Returns:
        dict: Dictionary of rupture information.

    """
    rlist = []
    nrup = len(rupts['events'])

    if args.index is not None:
        iter = args.index
        iter = map(int, iter)
    else:
        iter = range(nrup)

    for i in iter:

        event_name = rupts['events'][i]['desc']
        short_name = event_name.split('.xls')[0]
        id = rupts['events'][i]['id']
        magnitude = rupts['events'][i]['mag']
        if 'rake' in rupts['events'][i].keys():
            rake = rupts['events'][i]['rake']
        else:
            rake = np.nan

        # Does the file include a rupture model?
        if len(rupts['events'][i]['lats']) > 1:

            dip = rupts['events'][i]['dip']

            width = rupts['events'][i]['width']
            ztor = rupts['events'][i]['ztor']

            lons = rupts['events'][i]['lons']
            lats = rupts['events'][i]['lats']
            xp0 = np.array(lons[:-1])
            xp1 = np.array(lons[1:])
            yp0 = np.array(lats[:-1])
            yp1 = np.array(lats[1:])
            zp = np.ones_like(xp0) * ztor
            dips = np.ones_like(xp0) * dip
            widths = np.ones_like(xp0) * width

            P1 = geo.point.Point(lons[0], lats[0])
            P2 = geo.point.Point(lons[-1], lats[-1])
            strike = np.array([P1.azimuth(P2)])

            # Dummy origin
            origin = Origin({
                'mag': 0,
                'id': '',
                'lat': 0,
                'lon': 0,
                'depth': 0
            })
            rupt = QuadRupture.fromTrace(xp0,
                                         yp0,
                                         xp1,
                                         yp1,
                                         zp,
                                         widths,
                                         dips,
                                         origin,
                                         strike=strike,
                                         reference=args.reference)

            quads = rupt.getQuadrilaterals()
            edges = get_rupture_edges(quads)  # for hypo placement
            hlat, hlon, hdepth = get_hypo(edges, args)
        else:
            rupt = None
            edges = None
            hlat = float(rupts['events'][i]['lats'][0])
            hlon = float(rupts['events'][i]['lons'][0])

        id_str, eventsourcecode, real_desc = get_event_id(event_name,
                                                          magnitude,
                                                          args.directivity,
                                                          args.dirind,
                                                          quads,
                                                          id=id)

        event = {
            'lat': hlat,
            'lon': hlon,
            'depth': hdepth,
            'mag': magnitude,
            'rake': rake,
            'id': id_str,
            'locstring': event_name,
            'type': 'ALL',
            'timezone': 'UTC',
            'time': ShakeDateTime.utcfromtimestamp(int(time.time())),
            'created': ShakeDateTime.utcfromtimestamp(int(time.time()))
        }

        # Update rupture with new origin info
        if rupt is not None:
            origin = Origin(event)
            rupt = QuadRupture.fromTrace(xp0,
                                         yp0,
                                         xp1,
                                         yp1,
                                         zp,
                                         widths,
                                         dips,
                                         origin,
                                         strike=strike,
                                         reference=args.reference)

        rdict = {
            'rupture': rupt,
            'event': event,
            'edges': edges,
            'id_str': id_str,
            'short_name': short_name,
            'real_desc': real_desc,
            'eventsourcecode': eventsourcecode
        }
        rlist.append(rdict)

    return rlist
예제 #24
0
def test_so6():
    magnitude = 7.2
    dip = np.array([70])
    rake = 135
    width = np.array([15])
    L = 80
    rupx = np.array([0, 0])
    rupy = np.array([0, L])
    zp = np.array([0])

    # Convert to lat/lon
    proj = geo.utils.get_orthographic_projection(-122, -120, 39, 37)
    tlon, tlat = proj(rupx, rupy, reverse=True)

    # Dummy origin
    origin = Origin({
        'lat': 0,
        'lon': 0,
        'depth': 0,
        'mag': 0,
        'eventsourcecode': 'so6',
        'rake': rake
    })

    # Rupture
    rup = QuadRupture.fromTrace(np.array([tlon[0]]),
                                np.array([tlat[0]]),
                                np.array([tlon[1]]),
                                np.array([tlat[1]]),
                                zp,
                                width,
                                dip,
                                origin,
                                reference='rv4')

    # Sites
    x = np.linspace(-80, 80, 21)
    y = np.linspace(-50, 130, 21)
    site_x, site_y = np.meshgrid(x, y)
    slon, slat = proj(site_x, site_y, reverse=True)
    sdepth = np.zeros_like(slon)

    # Fix origin
    tmp = rup.getQuadrilaterals()[0]
    pp0 = Vector.fromPoint(
        point.Point(tmp[0].longitude, tmp[0].latitude, tmp[0].depth))
    pp1 = Vector.fromPoint(
        point.Point(tmp[1].longitude, tmp[1].latitude, tmp[1].depth))
    pp2 = Vector.fromPoint(
        point.Point(tmp[2].longitude, tmp[2].latitude, tmp[2].depth))
    pp3 = Vector.fromPoint(
        point.Point(tmp[3].longitude, tmp[3].latitude, tmp[3].depth))
    dxp = 10 / L
    dyp = (width - 5) / width
    mp0 = pp0 + (pp1 - pp0) * dxp
    mp1 = pp3 + (pp2 - pp3) * dxp
    rp = mp0 + (mp1 - mp0) * dyp
    epilat, epilon, epidepth = ecef2latlon(rp.x, rp.y, rp.z)
    epix, epiy = proj(epilon, epilat, reverse=False)

    origin = Origin({
        'lat': epilat,
        'lon': epilon,
        'depth': epidepth,
        'mag': magnitude,
        'eventsourcecode': 'so6',
        'rake': rake
    })

    ruplat = [a.latitude for a in rup.getQuadrilaterals()[0]]
    ruplon = [a.longitude for a in rup.getQuadrilaterals()[0]]
    ruplat = np.append(ruplat, ruplat[0])
    ruplon = np.append(ruplon, ruplon[0])
    rupx, rupy = proj(ruplon, ruplat, reverse=False)

    test1 = Bayless2013(origin, rup, slat, slon, sdepth, T=5)
    fd = test1.getFd()
    fd_test = np.array([
        [
            0.00000000e+00, 0.00000000e+00, 0.00000000e+00, -8.92879772e-03,
            -1.74526918e-02, -2.22981746e-02, -2.34350450e-02, -2.13620062e-02,
            -1.72712346e-02, -1.29509613e-02, -1.02545064e-02, -1.03010185e-02,
            -1.28847597e-02, -1.66274727e-02, -1.96984070e-02, -2.05377743e-02,
            -1.81831337e-02, -1.21881814e-02, -2.64862879e-03, 0.00000000e+00,
            0.00000000e+00
        ],
        [
            0.00000000e+00, 0.00000000e+00, -8.73221519e-03, -2.21421374e-02,
            -3.18438939e-02, -3.71488270e-02, -3.76239913e-02, -3.35015951e-02,
            -2.61748968e-02, -1.83864728e-02, -1.34793002e-02, -1.36687799e-02,
            -1.85727143e-02, -2.55527671e-02, -3.14227568e-02, -3.38933995e-02,
            -3.19289607e-02, -2.53396980e-02, -1.45943649e-02, -3.71405488e-04,
            0.00000000e+00
        ],
        [
            0.00000000e+00, -2.54621422e-03, -2.11428566e-02, -3.68609103e-02,
            -4.87464747e-02, -5.56539037e-02, -5.64419387e-02, -5.05331157e-02,
            -3.52919381e-02, -2.18782050e-02, -1.40858125e-02, -1.47354546e-02,
            -2.35727189e-02, -3.74838465e-02, -4.75915414e-02, -5.13000399e-02,
            -4.87882409e-02, -4.05716321e-02, -2.77368254e-02, -1.13542729e-02,
            0.00000000e+00
        ],
        [
            0.00000000e+00, -1.21642958e-02, -3.33747360e-02, -5.21661817e-02,
            -6.74724509e-02, -7.77628842e-02, -8.00243748e-02, -6.42496853e-02,
            -4.38124530e-02, -1.97027426e-02, -1.45897731e-02, -1.07427056e-02,
            -3.08235222e-02, -4.82656988e-02, -6.67692677e-02, -7.35152908e-02,
            -6.85574283e-02, -5.71811573e-02, -4.12138780e-02, -2.20396726e-02,
            -6.24121310e-04
        ],
        [
            0.00000000e+00, -2.00643401e-02, -4.39827328e-02, -6.62722434e-02,
            -8.60268414e-02, -1.01730306e-01, -9.86277741e-02, -9.82914922e-02,
            -5.22335876e-02, -1.54622435e-02, -1.57487554e-02, -3.06190808e-03,
            -4.81481586e-02, -8.92480491e-02, -8.63776477e-02, -9.98130440e-02,
            -8.95491230e-02, -7.33553695e-02, -5.34401725e-02, -3.11601812e-02,
            -7.33715103e-03
        ],
        [
            0.00000000e+00, -2.50053614e-02, -5.11695772e-02, -7.65997026e-02,
            -1.00809054e-01, -1.22877573e-01, -1.18738178e-01, -1.55236782e-01,
            -7.45388001e-02, 1.92779182e-03, -1.94380016e-02, 1.94922939e-02,
            -7.66669920e-02, -1.53909722e-01, -1.10846875e-01, -1.19746768e-01,
            -1.07680300e-01, -8.59905101e-02, -6.22042294e-02, -3.71802472e-02,
            -1.13867485e-02
        ],
        [
            0.00000000e+00, -2.63645827e-02, -5.37984901e-02, -8.11337022e-02,
            -1.08298371e-01, -1.35146441e-01, -1.34825430e-01, -1.85836050e-01,
            -1.10730875e-01, -3.18861095e-02, 4.14395701e-02, -1.52711946e-02,
            -1.31840763e-01, -1.96794707e-01, -1.33453212e-01, -1.34989129e-01,
            -1.17922385e-01, -9.21637323e-02, -6.58369237e-02, -3.91646838e-02,
            -1.22685698e-02
        ],
        [
            0.00000000e+00, -2.64622244e-02, -5.40483999e-02, -8.16190336e-02,
            -1.09162854e-01, -1.36656677e-01, -1.37081504e-01, -1.89522811e-01,
            -1.17723634e-01, -4.88765748e-02, -5.04529015e-03, -5.76414497e-02,
            -1.45712183e-01, -2.03062804e-01, -1.36859828e-01, -1.37107390e-01,
            -1.19124650e-01, -9.28263279e-02, -6.61800709e-02, -3.93088682e-02,
            -1.22842049e-02
        ],
        [
            0.00000000e+00, -2.58466495e-02, -5.24858827e-02, -7.86086164e-02,
            -1.03856343e-01, -1.27529509e-01, -1.23794779e-01, -1.68810613e-01,
            -8.22602627e-02, 1.74236964e-02, 9.38708725e-02, 4.23208284e-02,
            -8.46343723e-02, -1.70476759e-01, -1.17547884e-01, -1.24569752e-01,
            -1.11518670e-01, -8.84736806e-02, -6.38037151e-02, -3.81874381e-02,
            -1.19867610e-02
        ],
        [
            0.00000000e+00, -2.42186547e-02, -4.84175525e-02, -7.09428614e-02,
            -9.07754575e-02, -1.06117824e-01, -9.50228292e-02, -1.29781980e-01,
            -3.08573454e-02, 7.39058739e-02, 1.30478117e-01, 8.28181149e-02,
            -2.70389535e-02, -1.20837502e-01, -8.02081725e-02, -9.70274506e-02,
            -9.35853383e-02, -7.77422806e-02, -5.77817530e-02, -3.53067886e-02,
            -1.12414659e-02
        ],
        [
            0.00000000e+00, -2.16818717e-02, -4.22363856e-02, -5.96909893e-02,
            -7.24805224e-02, -7.81867829e-02, -6.11838569e-02, -9.05679744e-02,
            9.95934969e-03, 1.07503875e-01, 1.52073917e-01, 1.05894634e-01,
            8.68652263e-03, -7.98571818e-02, -4.16548658e-02, -6.40511838e-02,
            -6.99337160e-02, -6.26305633e-02, -4.89098800e-02, -3.09284566e-02,
            -1.00919381e-02
        ],
        [
            0.00000000e+00, -1.84940182e-02, -3.47054606e-02, -4.65278129e-02,
            -5.22037664e-02, -4.93977115e-02, -2.95395230e-02, -5.82421092e-02,
            3.91025654e-02, 1.29337956e-01, 1.67436703e-01, 1.21969296e-01,
            3.20823547e-02, -5.00287386e-02, -9.22993907e-03, -3.27186625e-02,
            -4.52706958e-02, -4.57409325e-02, -3.84701291e-02, -2.55751405e-02,
            -8.64950254e-03
        ],
        [
            0.00000000e+00, -1.49431380e-02, -2.65887341e-02, -3.29162158e-02,
            -3.22994323e-02, -2.29081781e-02, -2.60259636e-03, -3.29856530e-02,
            6.02631314e-02, 1.45003704e-01, 1.79361264e-01, 1.34292814e-01,
            4.88007115e-02, -2.82328554e-02, 1.64212421e-02, -5.72391847e-03,
            -2.23438861e-02, -2.90246794e-02, -2.76054402e-02, -1.97779758e-02,
            -7.03945406e-03
        ],
        [
            0.00000000e+00, -1.12771143e-02, -1.84737590e-02, -1.98228664e-02,
            -1.40092305e-02, 1.84580818e-04, 1.95817303e-02, -1.32608487e-02,
            7.62783168e-02, 1.57076433e-01, 1.89083905e-01, 1.44259188e-01,
            6.15722813e-02, -1.17505212e-02, 3.65938109e-02, 1.66937711e-02,
            -2.18970818e-03, -1.35507683e-02, -1.70890527e-02, -1.39519424e-02,
            -5.37036892e-03
        ],
        [
            0.00000000e+00, -7.67615215e-03, -1.07348257e-02, -7.75276739e-03,
            2.22351695e-03, 1.98662250e-02, 3.77611177e-02, 2.42018661e-03,
            8.89036172e-02, 1.66855206e-01, 1.97260700e-01, 1.52590263e-01,
            7.17981256e-02, 1.18005972e-03, 5.26852303e-02, 3.51638855e-02,
            1.51012176e-02, 2.69654076e-04, -7.33815554e-03, -8.36639665e-03,
            -3.72176313e-03
        ],
        [
            0.00000000e+00, -4.50552324e-03, -4.32262850e-03, 1.73559158e-03,
            1.42670366e-02, 3.35040699e-02, 4.97279358e-02, 1.85410528e-02,
            9.39950666e-02, 1.46646579e-01, 9.13474746e-02, 1.37004651e-01,
            7.74648339e-02, 1.59777072e-02, 6.25334939e-02, 4.74577418e-02,
            2.72155518e-02, 1.06174952e-02, 3.94103899e-04, -3.68465400e-03,
            -2.19830733e-03
        ],
        [
            0.00000000e+00, -1.74629916e-03, 5.44471813e-04, 8.22933499e-03,
            2.15699287e-02, 4.04232250e-02, 5.69678048e-02, 5.52408259e-02,
            9.04381272e-02, 1.08204635e-01, 9.14439984e-02, 1.06884511e-01,
            8.17241884e-02, 5.55282924e-02, 6.78528399e-02, 5.47188925e-02,
            3.35251483e-02, 1.69615982e-02, 5.72048628e-03, -8.81437278e-05,
            -7.36518436e-04
        ],
        [
            0.00000000e+00, 4.07838765e-05, 3.63933766e-03, 1.20080876e-02,
            2.51274691e-02, 4.25687176e-02, 6.25685606e-02, 7.33480475e-02,
            8.37515545e-02, 9.52500287e-02, 9.15135660e-02, 9.66442834e-02,
            8.66659913e-02, 8.10325633e-02, 7.18836713e-02, 5.45548434e-02,
            3.55884875e-02, 2.00142359e-02, 8.71200201e-03, 2.04407846e-03,
            -6.53680674e-06
        ],
        [
            0.00000000e+00, 2.40054729e-04, 4.44975227e-03, 1.27572519e-02,
            2.49362989e-02, 4.03831326e-02, 5.80039988e-02, 7.61280192e-02,
            8.37404162e-02, 8.89634569e-02, 9.15651607e-02, 9.13586235e-02,
            8.83589144e-02, 8.27804032e-02, 6.75666471e-02, 5.00483249e-02,
            3.36733366e-02, 1.96758691e-02, 9.00603204e-03, 2.18370401e-03,
            0.00000000e+00
        ],
        [
            0.00000000e+00, 0.00000000e+00, 2.78776980e-03, 1.05086036e-02,
            2.13238822e-02, 3.45577738e-02, 4.91570145e-02, 6.36787133e-02,
            7.63710088e-02, 8.54072310e-02, 8.92960200e-02, 8.75702197e-02,
            8.07095447e-02, 6.97999389e-02, 5.63787286e-02, 4.20734776e-02,
            2.83073312e-02, 1.61614525e-02, 6.56194125e-03, 1.00721924e-04,
            0.00000000e+00
        ],
        [
            0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 5.49667845e-03,
            1.47563319e-02, 2.57955743e-02, 3.76689418e-02, 4.91861917e-02,
            5.90108907e-02, 6.58478416e-02, 6.87018515e-02, 6.73174642e-02,
            6.20270643e-02, 5.35456385e-02, 4.29400416e-02, 3.14129728e-02,
            2.00795162e-02, 9.84001885e-03, 1.53992995e-03, 0.00000000e+00,
            0.00000000e+00
        ]
    ])
    np.testing.assert_allclose(fd, fd_test, rtol=1e-4)
예제 #25
0
def test_ss3_move_hypo1():
    magnitude = 7.2
    dip = np.array([90])
    rake = 180.0
    width = np.array([15])
    rupx = np.array([0, 0])
    rupy = np.array([0, 80])
    zp = np.array([0.0])
    epix = np.array([1.0])
    epiy = np.array([-1.0])

    # Convert to lat/lon
    proj = geo.utils.get_orthographic_projection(-122, -120, 39, 37)
    tlon, tlat = proj(rupx, rupy, reverse=True)
    epilon, epilat = proj(epix, epiy, reverse=True)

    # Origin
    origin = Origin({
        'lat': epilat[0],
        'lon': epilon[0],
        'depth': -1,
        'mag': magnitude,
        'eventsourcecode': 'ss3',
        'rake': rake
    })

    rup = QuadRupture.fromTrace(np.array([tlon[0]]),
                                np.array([tlat[0]]),
                                np.array([tlon[1]]),
                                np.array([tlat[1]]),
                                zp,
                                width,
                                dip,
                                origin,
                                reference='ss3')

    x = np.linspace(0, 20, 6)
    y = np.linspace(0, 90, 11)
    site_x, site_y = np.meshgrid(x, y)
    slon, slat = proj(site_x, site_y, reverse=True)
    deps = np.zeros_like(slon)

    test1 = Bayless2013(origin, rup, slat, slon, deps, T=1.0)
    phyp = copy.deepcopy(test1.phyp[0])
    plat, plon, pdep = ecef2latlon(phyp.x, phyp.y, phyp.z)

    px, py = proj(plon, plat, reverse=False)

    np.testing.assert_allclose(plat, 38.004233219183604, rtol=1e-4)
    np.testing.assert_allclose(plon, -120.98636122402166, rtol=1e-4)
    np.testing.assert_allclose(pdep, 7.4999999989205968, rtol=1e-4)

    # --------------------------------------------------------------------------
    # Also for multiple segments
    # --------------------------------------------------------------------------
    dip = np.array([90., 90., 90.])
    rake = 180.0
    width = np.array([15., 15., 10.])
    rupx = np.array([0., 0., 10., 20.])
    rupy = np.array([0., 20., 60., 80.])
    zp = np.array([0., 0., 0.])
    epix = np.array([0.])
    epiy = np.array([0.])

    # Convert to lat/lon
    proj = geo.utils.get_orthographic_projection(-122, -120, 39, 37)
    tlon, tlat = proj(rupx, rupy, reverse=True)
    epilon, epilat = proj(epix, epiy, reverse=True)

    rup = QuadRupture.fromTrace(np.array(tlon[0:3]),
                                np.array(tlat[0:3]),
                                np.array(tlon[1:4]),
                                np.array(tlat[1:4]),
                                zp,
                                width,
                                dip,
                                origin,
                                reference='')

    event = {
        'lat': epilat[0],
        'lon': epilon[0],
        'depth': 1.0,
        'mag': magnitude,
        'eventsourcecode': '',
        'locstring': 'test',
        'type': 'SS',
        'timezone': 'UTC'
    }
    event['time'] = HistoricTime.utcfromtimestamp(int(time.time()))
    event['created'] = HistoricTime.utcfromtimestamp(int(time.time()))
    x = np.linspace(0, 20, 6)
    y = np.linspace(0, 90, 11)
    site_x, site_y = np.meshgrid(x, y)
    slon, slat = proj(site_x, site_y, reverse=True)
    deps = np.zeros_like(slon)
    origin = Origin(event)
    origin.rake = rake
    test1 = Bayless2013(origin, rup, slat, slon, deps, T=1.0)

    # 1st pseudo-hyp
    phyp = copy.deepcopy(test1.phyp[0])
    plat, plon, pdep = ecef2latlon(phyp.x, phyp.y, phyp.z)
    px, py = proj(plon, plat, reverse=False)
    np.testing.assert_allclose(plat, 38.004233219183604, rtol=1e-4)
    np.testing.assert_allclose(plon, -120.98636122402166, rtol=1e-4)
    np.testing.assert_allclose(pdep, 7.4999999989205968, rtol=1e-4)

    # 2nd pseudo-hyp
    phyp = copy.deepcopy(test1.phyp[1])
    plat, plon, pdep = ecef2latlon(phyp.x, phyp.y, phyp.z)
    px, py = proj(plon, plat, reverse=False)
    np.testing.assert_allclose(plat, 38.184097835787796, rtol=1e-4)
    np.testing.assert_allclose(plon, -120.98636122402166, rtol=1e-4)
    np.testing.assert_allclose(pdep, 7.4999999989103525, rtol=1e-4)

    # 3rd pseudo-hyp
    phyp = copy.deepcopy(test1.phyp[2])
    plat, plon, pdep = ecef2latlon(phyp.x, phyp.y, phyp.z)
    px, py = proj(plon, plat, reverse=False)
    np.testing.assert_allclose(plat, 38.543778594535752, rtol=1e-4)
    np.testing.assert_allclose(plon, -120.87137783362499, rtol=1e-4)
    np.testing.assert_allclose(pdep, 4.9999999995063993, rtol=1e-4)
예제 #26
0
def test_ss3():
    magnitude = 7.2
    dip = np.array([90])
    rake = 180.0
    width = np.array([15])
    rupx = np.array([0, 0])
    rupy = np.array([0, 80])
    zp = np.array([0])
    epix = np.array([0])
    epiy = np.array([0.2 * rupy[1]])

    # Convert to lat/lon
    proj = geo.utils.get_orthographic_projection(-122, -120, 39, 37)
    tlon, tlat = proj(rupx, rupy, reverse=True)
    epilon, epilat = proj(epix, epiy, reverse=True)

    # Origin:
    origin = Origin({
        'lat': epilat[0],
        'lon': epilon[0],
        'depth': 10,
        'mag': magnitude,
        'eventsourcecode': 'ss3',
        'rake': rake
    })

    rup = QuadRupture.fromTrace(np.array([tlon[0]]),
                                np.array([tlat[0]]),
                                np.array([tlon[1]]),
                                np.array([tlat[1]]),
                                zp,
                                width,
                                dip,
                                origin,
                                reference='ss3')

    x = np.linspace(-60, 60, 21)
    y = np.linspace(-60, 138, 34)
    site_x, site_y = np.meshgrid(x, y)
    slon, slat = proj(site_x, site_y, reverse=True)
    deps = np.zeros_like(slon)

    test1 = Bayless2013(origin, rup, slat, slon, deps, T=1.0)

    # Test fd
    fd = test1.getFd()
    fd_test = np.array([
        [
            0.00000000e+00, 0.00000000e+00, 2.14620746e-03, 6.47899336e-03,
            1.23119791e-02, 1.91676140e-02, 2.64009788e-02, 3.32427846e-02,
            3.88863288e-02, 4.26104002e-02, 4.39120296e-02, 4.26104002e-02,
            3.88863288e-02, 3.32427846e-02, 2.64009788e-02, 1.91676140e-02,
            1.23119791e-02, 6.47899336e-03, 2.14620746e-03, 0.00000000e+00,
            0.00000000e+00
        ],
        [
            0.00000000e+00, 8.57780996e-04, 3.99405791e-03, 9.31948105e-03,
            1.65406113e-02, 2.51316805e-02, 3.43205435e-02, 4.31274592e-02,
            5.04747209e-02, 5.53634169e-02, 5.70796092e-02, 5.53634169e-02,
            5.04747209e-02, 4.31274592e-02, 3.43205435e-02, 2.51316805e-02,
            1.65406113e-02, 9.31948105e-03, 3.99405791e-03, 8.57780996e-04,
            0.00000000e+00
        ],
        [
            -7.32594549e-04, 1.80425497e-04, 3.76908220e-03, 1.00175179e-02,
            1.86854835e-02, 2.92291145e-02, 4.07487277e-02, 5.20057177e-02,
            6.15509770e-02, 6.79776087e-02, 7.02477931e-02, 6.79776087e-02,
            6.15509770e-02, 5.20057177e-02, 4.07487277e-02, 2.92291145e-02,
            1.86854835e-02, 1.00175179e-02, 3.76908220e-03, 1.80425497e-04,
            -7.32594549e-04
        ],
        [
            -3.29238561e-03, -2.60643191e-03, 1.16635260e-03, 8.15185259e-03,
            1.82290773e-02, 3.08983182e-02, 4.51608038e-02, 5.94769126e-02,
            7.18919113e-02, 8.03888307e-02, 8.34165399e-02, 8.03888307e-02,
            7.18919113e-02, 5.94769126e-02, 4.51608038e-02, 3.08983182e-02,
            1.82290773e-02, 8.15185259e-03, 1.16635260e-03, -2.60643191e-03,
            -3.29238561e-03
        ],
        [
            -7.68543266e-03, -7.63179286e-03, -4.08866637e-03, 3.27605236e-03,
            1.45558215e-02, 2.94068040e-02, 4.68176355e-02, 6.49397159e-02,
            7.72066272e-02, 8.50445368e-02, 8.77974692e-02, 8.50445368e-02,
            7.72066272e-02, 6.49397159e-02, 4.68176355e-02, 2.94068040e-02,
            1.45558215e-02, 3.27605236e-03, -4.08866637e-03, -7.63179286e-03,
            -7.68543266e-03
        ],
        [
            -1.38078234e-02, -1.49011067e-02, -1.21731364e-02, -5.02168047e-03,
            6.98177526e-03, 2.38268531e-02, 4.30419205e-02, 6.00041964e-02,
            7.44541603e-02, 8.42939552e-02, 8.77989590e-02, 8.42939552e-02,
            7.44541603e-02, 6.00041964e-02, 4.30419205e-02, 2.38268531e-02,
            6.98177526e-03, -5.02168047e-03, -1.21731364e-02, -1.49011067e-02,
            -1.38078234e-02
        ],
        [
            -2.13780396e-02, -2.42165379e-02, -2.30613142e-02, -1.70011475e-02,
            -5.15036128e-03, 1.25885635e-02, 3.24536739e-02, 5.25619351e-02,
            7.05100243e-02, 8.31900906e-02, 8.78003567e-02, 8.31900906e-02,
            7.05100243e-02, 5.25619351e-02, 3.24536739e-02, 1.25885635e-02,
            -5.15036128e-03, -1.70011475e-02, -2.30613142e-02, -2.42165379e-02,
            -2.13780396e-02
        ],
        [
            -2.98882710e-02, -3.50862342e-02, -3.63793490e-02, -3.25716319e-02,
            -2.22546618e-02, -3.59274163e-03, 1.83064517e-02, 4.20112440e-02,
            6.46115966e-02, 8.14746164e-02, 8.78016623e-02, 8.14746164e-02,
            6.46115966e-02, 4.20112440e-02, 1.83064517e-02, -3.59274163e-03,
            -2.22546618e-02, -3.25716319e-02, -3.63793490e-02, -3.50862342e-02,
            -2.98882710e-02
        ],
        [
            -3.85810679e-02, -4.66488633e-02, -5.12430987e-02, -5.10089462e-02,
            -4.20856023e-02, -2.36905234e-02, -6.33876287e-04, 2.66765430e-02,
            5.53289928e-02, 7.86066125e-02, 8.78028757e-02, 7.86066125e-02,
            5.53289928e-02, 2.66765430e-02, -6.33876287e-04, -2.36905234e-02,
            -4.20856023e-02, -5.10089462e-02, -5.12430987e-02, -4.66488633e-02,
            -3.85810679e-02
        ],
        [
            -4.64803335e-02, -5.76615888e-02, -6.61458422e-02, -7.06512643e-02,
            -6.38427394e-02, -4.77258398e-02, -2.55483969e-02, 4.05840724e-03,
            3.98470070e-02, 7.33053399e-02, 8.78039969e-02, 7.33053399e-02,
            3.98470070e-02, 4.05840724e-03, -2.55483969e-02, -4.77258398e-02,
            -6.38427394e-02, -7.06512643e-02, -6.61458422e-02, -5.76615888e-02,
            -4.64803335e-02
        ],
        [
            -5.25038299e-02, -6.66129442e-02, -7.90147081e-02, -8.87629178e-02,
            -8.59653118e-02, -7.42828398e-02, -5.64316505e-02, -2.87083225e-02,
            1.25945312e-02, 6.19971667e-02, 8.78050260e-02, 6.19971667e-02,
            1.25945312e-02, -2.87083225e-02, -5.64316505e-02, -7.42828398e-02,
            -8.59653118e-02, -8.87629178e-02, -7.90147081e-02, -6.66129442e-02,
            -5.25038299e-02
        ],
        [
            -5.69779111e-02, -7.36791817e-02, -8.97495345e-02, -1.04799583e-01,
            -1.07737239e-01, -1.02875880e-01, -9.46568471e-02, -7.95630162e-02,
            -4.96285112e-02, 6.59954795e-03, 5.25569882e-02, 6.59954795e-03,
            -4.96285112e-02, -7.95630162e-02, -9.46568471e-02, -1.02875880e-01,
            -1.07737239e-01, -1.04799583e-01, -8.97495345e-02, -7.36791817e-02,
            -5.69779111e-02
        ],
        [
            -5.90357675e-02, -7.69727119e-02, -9.48442826e-02, -1.12607620e-01,
            -1.18744885e-01, -1.18201834e-01, -1.17217017e-01, -1.15152899e-01,
            -1.09694433e-01, -8.82341332e-02, -1.61624035e-02, -8.82341332e-02,
            -1.09694433e-01, -1.15152899e-01, -1.17217017e-01, -1.18201834e-01,
            -1.18744885e-01, -1.12607620e-01, -9.48442826e-02, -7.69727119e-02,
            -5.90357675e-02
        ],
        [
            -5.92189452e-02, -7.72680305e-02, -9.53051857e-02, -1.13322519e-01,
            -1.19770917e-01, -1.19670660e-01, -1.19486798e-01, -1.19092639e-01,
            -1.17989113e-01, -1.12555820e-01, -4.50009776e-02, -1.12555820e-01,
            -1.17989113e-01, -1.19092639e-01, -1.19486798e-01, -1.19670660e-01,
            -1.19770917e-01, -1.13322519e-01, -9.53051857e-02, -7.72680305e-02,
            -5.92189452e-02
        ],
        [
            -5.79249958e-02, -7.51927112e-02, -9.20842554e-02, -1.08361430e-01,
            -1.12722790e-01, -1.09732675e-01, -1.04531672e-01, -9.44729544e-02,
            -7.23277773e-02, -2.05699911e-02, 3.58249631e-02, -2.05699911e-02,
            -7.23277773e-02, -9.44729544e-02, -1.04531672e-01, -1.09732675e-01,
            -1.12722790e-01, -1.08361430e-01, -9.20842554e-02, -7.51927112e-02,
            -5.79249958e-02
        ],
        [
            -5.42527703e-02, -6.93641123e-02, -8.31684773e-02, -9.49114165e-02,
            -9.41989454e-02, -8.48645354e-02, -7.00894708e-02, -4.58286259e-02,
            -6.37563061e-03, 4.68887998e-02, 7.77968419e-02, 4.68887998e-02,
            -6.37563061e-03, -4.58286259e-02, -7.00894708e-02, -8.48645354e-02,
            -9.41989454e-02, -9.49114165e-02, -8.31684773e-02, -6.93641123e-02,
            -5.42527703e-02
        ],
        [
            -4.82490057e-02, -5.99997941e-02, -6.91786120e-02, -7.44891242e-02,
            -6.73705808e-02, -5.13001284e-02, -2.84188057e-02, 3.60143816e-03,
            4.47470123e-02, 8.58663851e-02, 1.04548354e-01, 8.58663851e-02,
            4.47470123e-02, 3.60143816e-03, -2.84188057e-02, -5.13001284e-02,
            -6.73705808e-02, -7.44891242e-02, -6.91786120e-02, -5.99997941e-02,
            -4.82490057e-02
        ],
        [
            -4.03203010e-02, -4.79063206e-02, -5.16352259e-02, -4.98707253e-02,
            -3.67295509e-02, -1.57342058e-02, 1.13668830e-02, 4.46551184e-02,
            8.10450840e-02, 1.11780747e-01, 1.24226598e-01, 1.11780747e-01,
            8.10450840e-02, 4.46551184e-02, 1.13668830e-02, -1.57342058e-02,
            -3.67295509e-02, -4.98707253e-02, -5.16352259e-02, -4.79063206e-02,
            -4.03203010e-02
        ],
        [
            -3.10250239e-02, -3.40796094e-02, -3.22089254e-02, -2.37094100e-02,
            -5.85463114e-03, 1.77402761e-02, 4.57786845e-02, 7.69637052e-02,
            1.07537652e-01, 1.30906328e-01, 1.39800436e-01, 1.30906328e-01,
            1.07537652e-01, 7.69637052e-02, 4.57786845e-02, 1.77402761e-02,
            -5.85463114e-03, -2.37094100e-02, -3.22089254e-02, -3.40796094e-02,
            -3.10250239e-02
        ],
        [
            -2.09301700e-02, -1.94475962e-02, -1.22970199e-02, 2.07296407e-03,
            2.31516868e-02, 4.74574033e-02, 7.44743481e-02, 1.02380049e-01,
            1.27776301e-01, 1.46003379e-01, 1.52690015e-01, 1.46003379e-01,
            1.27776301e-01, 1.02380049e-01, 7.44743481e-02, 4.74574033e-02,
            2.31516868e-02, 2.07296407e-03, -1.22970199e-02, -1.94475962e-02,
            -2.09301700e-02
        ],
        [
            -1.05257992e-02, -4.74329696e-03, 7.12107274e-03, 2.63431361e-02,
            4.93709790e-02, 7.31527220e-02, 9.82233938e-02, 1.22728059e-01,
            1.43894925e-01, 1.58465026e-01, 1.63685984e-01, 1.58465026e-01,
            1.43894925e-01, 1.22728059e-01, 9.82233938e-02, 7.31527220e-02,
            4.93709790e-02, 2.63431361e-02, 7.12107274e-03, -4.74329696e-03,
            -1.05257992e-02
        ],
        [
            -1.89098657e-04, 9.52392382e-03, 2.54577716e-02, 4.85730869e-02,
            7.26048516e-02, 9.51726659e-02, 1.17988523e-01, 1.39380421e-01,
            1.57176612e-01, 1.69076915e-01, 1.73274075e-01, 1.69076915e-01,
            1.57176612e-01, 1.39380421e-01, 1.17988523e-01, 9.51726659e-02,
            7.26048516e-02, 4.85730869e-02, 2.54577716e-02, 9.52392382e-03,
            -1.89098657e-04
        ],
        [
            9.81732797e-03, 2.30419581e-02, 4.24234701e-02, 6.86213308e-02,
            9.30164618e-02, 1.14050063e-01, 1.34620894e-01, 1.53304069e-01,
            1.68420867e-01, 1.78321253e-01, 1.81774183e-01, 1.78321253e-01,
            1.68420867e-01, 1.53304069e-01, 1.34620894e-01, 1.14050063e-01,
            9.30164618e-02, 6.86213308e-02, 4.24234701e-02, 2.30419581e-02,
            9.81732797e-03
        ],
        [
            1.93290725e-02, 3.56493099e-02, 5.79271157e-02, 8.65611122e-02,
            1.10914315e-01, 1.30317702e-01, 1.48798006e-01, 1.65173224e-01,
            1.78147031e-01, 1.86513895e-01, 1.89408199e-01, 1.86513895e-01,
            1.78147031e-01, 1.65173224e-01, 1.48798006e-01, 1.30317702e-01,
            1.10914315e-01, 8.65611122e-02, 5.79271157e-02, 3.56493099e-02,
            1.93290725e-02
        ],
        [
            2.68168937e-02, 4.52356810e-02, 6.92261217e-02, 9.89630241e-02,
            1.23093435e-01, 1.40640067e-01, 1.56998943e-01, 1.71215219e-01,
            1.82297185e-01, 1.89360704e-01, 1.91789146e-01, 1.89360704e-01,
            1.82297185e-01, 1.71215219e-01, 1.56998943e-01, 1.40640067e-01,
            1.23093435e-01, 9.89630241e-02, 6.92261217e-02, 4.52356810e-02,
            2.68168937e-02
        ],
        [
            3.19403269e-02, 5.15051953e-02, 7.61032066e-02, 1.05705197e-01,
            1.31722206e-01, 1.47466588e-01, 1.61892450e-01, 1.74235616e-01,
            1.83735386e-01, 1.89735533e-01, 1.91788616e-01, 1.89735533e-01,
            1.83735386e-01, 1.74235616e-01, 1.61892450e-01, 1.47466588e-01,
            1.31722206e-01, 1.05705197e-01, 7.61032066e-02, 5.15051953e-02,
            3.19403269e-02
        ],
        [
            3.48604070e-02, 5.49292382e-02, 7.94274234e-02, 1.08149011e-01,
            1.38923419e-01, 1.53070440e-01, 1.65849067e-01, 1.76646162e-01,
            1.84871647e-01, 1.90029617e-01, 1.91787948e-01, 1.90029617e-01,
            1.84871647e-01, 1.76646162e-01, 1.65849067e-01, 1.53070440e-01,
            1.38923419e-01, 1.08149011e-01, 7.94274234e-02, 5.49292382e-02,
            3.48604070e-02
        ],
        [
            3.53402022e-02, 5.53653759e-02, 7.91965502e-02, 1.06486934e-01,
            1.36563003e-01, 1.57713955e-01, 1.69087164e-01, 1.78598269e-01,
            1.85784340e-01, 1.90264452e-01, 1.91787141e-01, 1.90264452e-01,
            1.85784340e-01, 1.78598269e-01, 1.69087164e-01, 1.57713955e-01,
            1.36563003e-01, 1.06486934e-01, 7.91965502e-02, 5.53653759e-02,
            3.53402022e-02
        ],
        [
            3.32889822e-02, 5.28319225e-02, 7.55769079e-02, 1.01077605e-01,
            1.28592068e-01, 1.57023616e-01, 1.71766715e-01, 1.80199729e-01,
            1.86528091e-01, 1.90454829e-01, 1.91786196e-01, 1.90454829e-01,
            1.86528091e-01, 1.80199729e-01, 1.71766715e-01, 1.57023616e-01,
            1.28592068e-01, 1.01077605e-01, 7.55769079e-02, 5.28319225e-02,
            3.32889822e-02
        ],
        [
            2.87295370e-02, 4.74613283e-02, 6.88388861e-02, 9.23568989e-02,
            1.17254645e-01, 1.42483223e-01, 1.66695764e-01, 1.81528776e-01,
            1.87141877e-01, 1.90611190e-01, 1.91785112e-01, 1.90611190e-01,
            1.87141877e-01, 1.81528776e-01, 1.66695764e-01, 1.42483223e-01,
            1.17254645e-01, 9.23568989e-02, 6.88388861e-02, 4.74613283e-02,
            2.87295370e-02
        ],
        [
            2.17650266e-02, 3.94568191e-02, 5.93023344e-02, 8.07720575e-02,
            1.03124482e-01, 1.25394282e-01, 1.46405870e-01, 1.64828303e-01,
            1.79288925e-01, 1.88553222e-01, 1.91747252e-01, 1.88553222e-01,
            1.79288925e-01, 1.64828303e-01, 1.46405870e-01, 1.25394282e-01,
            1.03124482e-01, 8.07720575e-02, 5.93023344e-02, 3.94568191e-02,
            2.17650266e-02
        ],
        [
            1.25495284e-02, 2.90572166e-02, 4.72972116e-02, 6.67423656e-02,
            8.66951873e-02, 1.06290296e-01, 1.24520131e-01, 1.40293247e-01,
            1.52531693e-01, 1.60303860e-01, 1.62970689e-01, 1.60303860e-01,
            1.52531693e-01, 1.40293247e-01, 1.24520131e-01, 1.06290296e-01,
            8.66951873e-02, 6.67423656e-02, 4.72972116e-02, 2.90572166e-02,
            1.25495284e-02
        ],
        [
            1.26441934e-03, 1.65114811e-02, 3.31390978e-02, 5.06407706e-02,
            6.83765492e-02, 8.55839448e-02, 1.01408074e-01, 1.14955639e-01,
            1.25373662e-01, 1.31946425e-01, 1.34193829e-01, 1.31946425e-01,
            1.25373662e-01, 1.14955639e-01, 1.01408074e-01, 8.55839448e-02,
            6.83765492e-02, 5.06407706e-02, 3.31390978e-02, 1.65114811e-02,
            1.26441934e-03
        ],
        [
            0.00000000e+00, 2.06213867e-03, 1.71162845e-02, 3.27888240e-02,
            4.85026462e-02, 6.35932476e-02, 7.73387997e-02, 8.90069217e-02,
            9.79166934e-02, 1.03509489e-01, 1.05416736e-01, 1.03509489e-01,
            9.79166934e-02, 8.90069217e-02, 7.73387997e-02, 6.35932476e-02,
            4.85026462e-02, 3.27888240e-02, 1.71162845e-02, 2.06213867e-03,
            0.00000000e+00
        ]
    ])
    np.testing.assert_allclose(fd, fd_test, rtol=1e-4)
예제 #27
0
def test_EdgeRupture():
    # Rupture requires an origin even when not used:
    origin = Origin({'eventsourcecode': 'test', 'lat': 0, 'lon': 0,
                     'depth': 5.0, 'mag': 7.0})

    file = os.path.join(homedir, 'rupture_data/cascadia.json')
    rup = get_rupture(origin, file)
    np.testing.assert_allclose(rup.getArea(), 105635.92827547337)

    # Force read Northridge as EdgeRupture
    file = os.path.join(homedir, 'rupture_data/northridge_fault.txt')
    d = text_to_json(file)
    rupt = EdgeRupture(d, origin)
    strike = rupt.getStrike()
    np.testing.assert_allclose(strike, 121.97, atol=0.01)
    dip = rupt.getDip()
    np.testing.assert_allclose(dip, 40.12, atol=0.01)
    L = rupt.getLength()
    np.testing.assert_allclose(L, 17.99, atol=0.01)
    W = rupt.getWidth()
    np.testing.assert_allclose(W, 23.92, atol=0.01)
    ztor = rupt.getDepthToTop()
    np.testing.assert_allclose(ztor, 5, atol=0.01)

    # And again for the same vertices but reversed order
    file = os.path.join(homedir, 'rupture_data/northridge_fixed_fault.txt')
    d = text_to_json(file)
    rupt = EdgeRupture(d, origin)
    strike = rupt.getStrike()
    np.testing.assert_allclose(strike, 121.97, atol=0.01)
    dip = rupt.getDip()
    np.testing.assert_allclose(dip, 40.12, atol=0.01)
    L = rupt.getLength()
    np.testing.assert_allclose(L, 17.99, atol=0.01)
    W = rupt.getWidth()
    np.testing.assert_allclose(W, 23.92, atol=0.01)
    ztor = rupt.getDepthToTop()
    np.testing.assert_allclose(ztor, 5, atol=0.01)

    # Test for fromArrays method
    toplats = np.array([37.0, 38.0])
    toplons = np.array([-120.0, -120.0])
    topdeps = np.array([0.0, 0.0])
    botlats = copy.copy(toplats)
    botlons = copy.copy(toplons)
    botdeps = np.array([10.0, 10.0])
    erup = EdgeRupture.fromArrays(toplons, toplats, topdeps, botlons, botlats,
                                  botdeps, origin)
    qrup = QuadRupture.fromVertices(
        [toplons[0]], [toplats[0]], [topdeps[0]],
        [toplons[1]], [toplats[1]], [topdeps[1]],
        [botlons[1]], [botlats[1]], [botdeps[1]],
        [botlons[0]], [botlats[0]], [botdeps[0]],
        origin)
    np.testing.assert_allclose(erup.getArea(), 1108.9414759967776)
    np.testing.assert_allclose(erup.getDepthToTop(), 0)
    np.testing.assert_allclose(erup.getLength(), 111.19492664455889)
    np.testing.assert_allclose(
        erup.lats, np.array([37.,  38.,  38.,  37.,  37.,  np.nan]))
    np.testing.assert_allclose(
        erup.lons, np.array([-120., -120., -120., -120., -120.,  np.nan]))
    np.testing.assert_allclose(
        erup.depths, np.array([0.,   0.,  10.,  10.,   0.,  np.nan]))
    np.testing.assert_allclose(
        erup._getGroupIndex(), np.array([0.,   0.]))
    quads = erup.getQuadrilaterals()
    np.testing.assert_allclose(quads[0][0].x, -120.0)

    # Need to also test the distances with EdgeRupture
    lons = np.linspace(-120.1, -121.0, 10)
    lats = np.linspace(37.0, 38, 10)
    deps = np.zeros_like(lons)
    rrup1 = qrup.computeRrup(lons, lats, deps)
    rrup2 = erup.computeRrup(lons, lats, deps)
    np.testing.assert_allclose(rrup1, rrup2, atol=2e-2)
    rjb1 = qrup.computeRjb(lons, lats, deps)
    rjb2 = erup.computeRjb(lons, lats, deps)
    np.testing.assert_allclose(rjb1, rjb2, atol=2e-2)
    gc2 = erup.computeGC2(lons, lats, deps)
    targetRy0 = np.array(
      [0., 0.,  0., 0.,  0.,
       0., 0.,  0., 0.,  0.67335931])
    targetRx = np.array(
      [-8.88024949, -17.73390996, -26.56167797, -35.3634266,
       -44.13902929, -52.88835984, -61.61129242, -70.30770154,
       -78.97746209, -87.6204493])
    np.testing.assert_allclose(gc2['ry0'], targetRy0)
    np.testing.assert_allclose(gc2['rx'], targetRx)
예제 #28
0
def test_so6():
    magnitude = 7.2
    dip = np.array([70])
    rake = 135
    width = np.array([15])
    L = 80
    rupx = np.array([0, 0])
    rupy = np.array([0, L])
    zp = np.array([0])

    # Convert to lat/lon
    proj = geo.utils.get_orthographic_projection(-122, -120, 39, 37)
    tlon, tlat = proj(rupx, rupy, reverse=True)

    # Dummy origin
    origin = Origin({'lat': 0,
                     'lon': 0,
                     'depth': 0,
                     'mag': 0,
                     'eventsourcecode': 'so6',
                     'rake': rake})

    # Rupture
    rup = QuadRupture.fromTrace(
        np.array([tlon[0]]), np.array([tlat[0]]),
        np.array([tlon[1]]), np.array([tlat[1]]),
        zp, width, dip, origin, reference='rv4')

    # Sites
    x = np.linspace(-80, 80, 21)
    y = np.linspace(-50, 130, 21)
    site_x, site_y = np.meshgrid(x, y)
    slon, slat = proj(site_x, site_y, reverse=True)
    sdepth = np.zeros_like(slon)

    # Fix origin
    tmp = rup.getQuadrilaterals()[0]
    pp0 = Vector.fromPoint(point.Point(
        tmp[0].longitude, tmp[0].latitude, tmp[0].depth))
    pp1 = Vector.fromPoint(point.Point(
        tmp[1].longitude, tmp[1].latitude, tmp[1].depth))
    pp2 = Vector.fromPoint(point.Point(
        tmp[2].longitude, tmp[2].latitude, tmp[2].depth))
    pp3 = Vector.fromPoint(point.Point(
        tmp[3].longitude, tmp[3].latitude, tmp[3].depth))
    dxp = 10 / L
    dyp = (width - 5) / width
    mp0 = pp0 + (pp1 - pp0) * dxp
    mp1 = pp3 + (pp2 - pp3) * dxp
    rp = mp0 + (mp1 - mp0) * dyp
    epilat, epilon, epidepth = ecef2latlon(rp.x, rp.y, rp.z)
    epix, epiy = proj(epilon, epilat, reverse=False)

    origin = Origin({'lat': epilat,
                     'lon': epilon,
                     'depth': epidepth,
                     'mag': magnitude,
                     'eventsourcecode': 'so6',
                     'rake': rake})

    ruplat = [a.latitude for a in rup.getQuadrilaterals()[0]]
    ruplon = [a.longitude for a in rup.getQuadrilaterals()[0]]
    ruplat = np.append(ruplat, ruplat[0])
    ruplon = np.append(ruplon, ruplon[0])
    rupx, rupy = proj(ruplon, ruplat, reverse=False)

    test1 = Bayless2013(origin, rup, slat, slon, sdepth, T=5)
    fd = test1.getFd()
    fd_test = np.array(
        [[0.00000000e+00,   0.00000000e+00,   0.00000000e+00,
          -8.92879772e-03,  -1.74526918e-02,  -2.22981746e-02,
          -2.34350450e-02,  -2.13620062e-02,  -1.72712346e-02,
          -1.29509613e-02,  -1.02545064e-02,  -1.03010185e-02,
          -1.28847597e-02,  -1.66274727e-02,  -1.96984070e-02,
          -2.05377743e-02,  -1.81831337e-02,  -1.21881814e-02,
          -2.64862879e-03,   0.00000000e+00,   0.00000000e+00],
         [0.00000000e+00,   0.00000000e+00,  -8.73221519e-03,
          -2.21421374e-02,  -3.18438939e-02,  -3.71488270e-02,
          -3.76239913e-02,  -3.35015951e-02,  -2.61748968e-02,
          -1.83864728e-02,  -1.34793002e-02,  -1.36687799e-02,
          -1.85727143e-02,  -2.55527671e-02,  -3.14227568e-02,
          -3.38933995e-02,  -3.19289607e-02,  -2.53396980e-02,
          -1.45943649e-02,  -3.71405488e-04,   0.00000000e+00],
            [0.00000000e+00,  -2.54621422e-03,  -2.11428566e-02,
             -3.68609103e-02,  -4.87464747e-02,  -5.56539037e-02,
             -5.64419387e-02,  -5.05331157e-02,  -3.52919381e-02,
             -2.18782050e-02,  -1.40858125e-02,  -1.47354546e-02,
             -2.35727189e-02,  -3.74838465e-02,  -4.75915414e-02,
             -5.13000399e-02,  -4.87882409e-02,  -4.05716321e-02,
             -2.77368254e-02,  -1.13542729e-02,   0.00000000e+00],
            [0.00000000e+00,  -1.21642958e-02,  -3.33747360e-02,
             -5.21661817e-02,  -6.74724509e-02,  -7.77628842e-02,
             -8.00243748e-02,  -6.42496853e-02,  -4.38124530e-02,
             -1.97027426e-02,  -1.45897731e-02,  -1.07427056e-02,
             -3.08235222e-02,  -4.82656988e-02,  -6.67692677e-02,
             -7.35152908e-02,  -6.85574283e-02,  -5.71811573e-02,
             -4.12138780e-02,  -2.20396726e-02,  -6.24121310e-04],
            [0.00000000e+00,  -2.00643401e-02,  -4.39827328e-02,
             -6.62722434e-02,  -8.60268414e-02,  -1.01730306e-01,
             -9.86277741e-02,  -9.82914922e-02,  -5.22335876e-02,
             -1.54622435e-02,  -1.57487554e-02,  -3.06190808e-03,
             -4.81481586e-02,  -8.92480491e-02,  -8.63776477e-02,
             -9.98130440e-02,  -8.95491230e-02,  -7.33553695e-02,
             -5.34401725e-02,  -3.11601812e-02,  -7.33715103e-03],
            [0.00000000e+00,  -2.50053614e-02,  -5.11695772e-02,
             -7.65997026e-02,  -1.00809054e-01,  -1.22877573e-01,
             -1.18738178e-01,  -1.55236782e-01,  -7.45388001e-02,
             1.92779182e-03,  -1.94380016e-02,   1.94922939e-02,
             -7.66669920e-02,  -1.53909722e-01,  -1.10846875e-01,
             -1.19746768e-01,  -1.07680300e-01,  -8.59905101e-02,
             -6.22042294e-02,  -3.71802472e-02,  -1.13867485e-02],
            [0.00000000e+00,  -2.63645827e-02,  -5.37984901e-02,
             -8.11337022e-02,  -1.08298371e-01,  -1.35146441e-01,
             -1.34825430e-01,  -1.85836050e-01,  -1.10730875e-01,
             -3.18861095e-02,   4.14395701e-02,  -1.52711946e-02,
             -1.31840763e-01,  -1.96794707e-01,  -1.33453212e-01,
             -1.34989129e-01,  -1.17922385e-01,  -9.21637323e-02,
             -6.58369237e-02,  -3.91646838e-02,  -1.22685698e-02],
            [0.00000000e+00,  -2.64622244e-02,  -5.40483999e-02,
             -8.16190336e-02,  -1.09162854e-01,  -1.36656677e-01,
             -1.37081504e-01,  -1.89522811e-01,  -1.17723634e-01,
             -4.88765748e-02,  -5.04529015e-03,  -5.76414497e-02,
             -1.45712183e-01,  -2.03062804e-01,  -1.36859828e-01,
             -1.37107390e-01,  -1.19124650e-01,  -9.28263279e-02,
             -6.61800709e-02,  -3.93088682e-02,  -1.22842049e-02],
            [0.00000000e+00,  -2.58466495e-02,  -5.24858827e-02,
             -7.86086164e-02,  -1.03856343e-01,  -1.27529509e-01,
             -1.23794779e-01,  -1.68810613e-01,  -8.22602627e-02,
             1.74236964e-02,   9.38708725e-02,   4.23208284e-02,
             -8.46343723e-02,  -1.70476759e-01,  -1.17547884e-01,
             -1.24569752e-01,  -1.11518670e-01,  -8.84736806e-02,
             -6.38037151e-02,  -3.81874381e-02,  -1.19867610e-02],
            [0.00000000e+00,  -2.42186547e-02,  -4.84175525e-02,
             -7.09428614e-02,  -9.07754575e-02,  -1.06117824e-01,
             -9.50228292e-02,  -1.29781980e-01,  -3.08573454e-02,
             7.39058739e-02,   1.30478117e-01,   8.28181149e-02,
             -2.70389535e-02,  -1.20837502e-01,  -8.02081725e-02,
             -9.70274506e-02,  -9.35853383e-02,  -7.77422806e-02,
             -5.77817530e-02,  -3.53067886e-02,  -1.12414659e-02],
            [0.00000000e+00,  -2.16818717e-02,  -4.22363856e-02,
             -5.96909893e-02,  -7.24805224e-02,  -7.81867829e-02,
             -6.11838569e-02,  -9.05679744e-02,   9.95934969e-03,
             1.07503875e-01,   1.52073917e-01,   1.05894634e-01,
             8.68652263e-03,  -7.98571818e-02,  -4.16548658e-02,
             -6.40511838e-02,  -6.99337160e-02,  -6.26305633e-02,
             -4.89098800e-02,  -3.09284566e-02,  -1.00919381e-02],
            [0.00000000e+00,  -1.84940182e-02,  -3.47054606e-02,
             -4.65278129e-02,  -5.22037664e-02,  -4.93977115e-02,
             -2.95395230e-02,  -5.82421092e-02,   3.91025654e-02,
             1.29337956e-01,   1.67436703e-01,   1.21969296e-01,
             3.20823547e-02,  -5.00287386e-02,  -9.22993907e-03,
             -3.27186625e-02,  -4.52706958e-02,  -4.57409325e-02,
             -3.84701291e-02,  -2.55751405e-02,  -8.64950254e-03],
            [0.00000000e+00,  -1.49431380e-02,  -2.65887341e-02,
             -3.29162158e-02,  -3.22994323e-02,  -2.29081781e-02,
             -2.60259636e-03,  -3.29856530e-02,   6.02631314e-02,
             1.45003704e-01,   1.79361264e-01,   1.34292814e-01,
             4.88007115e-02,  -2.82328554e-02,   1.64212421e-02,
             -5.72391847e-03,  -2.23438861e-02,  -2.90246794e-02,
             -2.76054402e-02,  -1.97779758e-02,  -7.03945406e-03],
            [0.00000000e+00,  -1.12771143e-02,  -1.84737590e-02,
             -1.98228664e-02,  -1.40092305e-02,   1.84580818e-04,
             1.95817303e-02,  -1.32608487e-02,   7.62783168e-02,
             1.57076433e-01,   1.89083905e-01,   1.44259188e-01,
             6.15722813e-02,  -1.17505212e-02,   3.65938109e-02,
             1.66937711e-02,  -2.18970818e-03,  -1.35507683e-02,
             -1.70890527e-02,  -1.39519424e-02,  -5.37036892e-03],
            [0.00000000e+00,  -7.67615215e-03,  -1.07348257e-02,
             -7.75276739e-03,   2.22351695e-03,   1.98662250e-02,
             3.77611177e-02,   2.42018661e-03,   8.89036172e-02,
             1.66855206e-01,   1.97260700e-01,   1.52590263e-01,
             7.17981256e-02,   1.18005972e-03,   5.26852303e-02,
             3.51638855e-02,   1.51012176e-02,   2.69654076e-04,
             -7.33815554e-03,  -8.36639665e-03,  -3.72176313e-03],
            [0.00000000e+00,  -4.50552324e-03,  -4.32262850e-03,
             1.73559158e-03,   1.42670366e-02,   3.35040699e-02,
             4.97279358e-02,   1.85410528e-02,   9.39950666e-02,
             1.46646579e-01,   9.13474746e-02,   1.37004651e-01,
             7.74648339e-02,   1.59777072e-02,   6.25334939e-02,
             4.74577418e-02,   2.72155518e-02,   1.06174952e-02,
             3.94103899e-04,  -3.68465400e-03,  -2.19830733e-03],
            [0.00000000e+00,  -1.74629916e-03,   5.44471813e-04,
             8.22933499e-03,   2.15699287e-02,   4.04232250e-02,
             5.69678048e-02,   5.52408259e-02,   9.04381272e-02,
             1.08204635e-01,   9.14439984e-02,   1.06884511e-01,
             8.17241884e-02,   5.55282924e-02,   6.78528399e-02,
             5.47188925e-02,   3.35251483e-02,   1.69615982e-02,
             5.72048628e-03,  -8.81437278e-05,  -7.36518436e-04],
            [0.00000000e+00,   4.07838765e-05,   3.63933766e-03,
             1.20080876e-02,   2.51274691e-02,   4.25687176e-02,
             6.25685606e-02,   7.33480475e-02,   8.37515545e-02,
             9.52500287e-02,   9.15135660e-02,   9.66442834e-02,
             8.66659913e-02,   8.10325633e-02,   7.18836713e-02,
             5.45548434e-02,   3.55884875e-02,   2.00142359e-02,
             8.71200201e-03,   2.04407846e-03,  -6.53680674e-06],
            [0.00000000e+00,   2.40054729e-04,   4.44975227e-03,
             1.27572519e-02,   2.49362989e-02,   4.03831326e-02,
             5.80039988e-02,   7.61280192e-02,   8.37404162e-02,
             8.89634569e-02,   9.15651607e-02,   9.13586235e-02,
             8.83589144e-02,   8.27804032e-02,   6.75666471e-02,
             5.00483249e-02,   3.36733366e-02,   1.96758691e-02,
             9.00603204e-03,   2.18370401e-03,   0.00000000e+00],
            [0.00000000e+00,   0.00000000e+00,   2.78776980e-03,
             1.05086036e-02,   2.13238822e-02,   3.45577738e-02,
             4.91570145e-02,   6.36787133e-02,   7.63710088e-02,
             8.54072310e-02,   8.92960200e-02,   8.75702197e-02,
             8.07095447e-02,   6.97999389e-02,   5.63787286e-02,
             4.20734776e-02,   2.83073312e-02,   1.61614525e-02,
             6.56194125e-03,   1.00721924e-04,   0.00000000e+00],
            [0.00000000e+00,   0.00000000e+00,   0.00000000e+00,
             5.49667845e-03,   1.47563319e-02,   2.57955743e-02,
             3.76689418e-02,   4.91861917e-02,   5.90108907e-02,
             6.58478416e-02,   6.87018515e-02,   6.73174642e-02,
             6.20270643e-02,   5.35456385e-02,   4.29400416e-02,
             3.14129728e-02,   2.00795162e-02,   9.84001885e-03,
             1.53992995e-03,   0.00000000e+00,   0.00000000e+00]]
    )
    np.testing.assert_allclose(fd, fd_test, rtol=1e-4)
def test_multisegment_discordant():
    # The one thing that isn't check above is discordancy for segments
    # with multiple quads. For this, we need a synthetic example.
    x0 = np.array([0, 1, -1, 10, 9, 7])
    y0 = np.array([0, 10, 20, 40, 35, 30])
    z0 = np.array([0, 0, 0, 0, 0, 0])
    x1 = np.array([1, -1, 0, 9, 7, 6])
    y1 = np.array([10, 20, 30, 35, 30, 25])
    z1 = np.array([0, 0, 0, 0, 0, 0])
    x2 = np.array([3, 1, 2, 7, 5, 4])
    y2 = np.array([10, 20, 30, 35, 30, 25])
    z2 = np.array([10, 10, 10, 10, 10, 10])
    x3 = np.array([2, 3, 1, 8, 7, 5])
    y3 = np.array([0, 10, 20, 40, 35, 30])
    z3 = np.array([10, 10, 10, 10, 10, 10])

    epilat = 32.15270
    epilon = -115.30500
    proj = geo.utils.get_orthographic_projection(epilon - 1, epilon + 1,
                                                 epilat + 1, epilat - 1)
    lon0, lat0 = proj(x0, y0, reverse=True)
    lon1, lat1 = proj(x1, y1, reverse=True)
    lon2, lat2 = proj(x2, y2, reverse=True)
    lon3, lat3 = proj(x3, y3, reverse=True)

    # Make an Origin object; most of the 'event' values don't matter for
    # this example
    origin = Origin({
        'lat': 0,
        'lon': 0,
        'depth': 0,
        'mag': 7.2,
        'eventsourcecode': ''
    })
    rup = QuadRupture.fromVertices(lon0,
                                   lat0,
                                   z0,
                                   lon1,
                                   lat1,
                                   z1,
                                   lon2,
                                   lat2,
                                   z2,
                                   lon3,
                                   lat3,
                                   z3,
                                   origin,
                                   group_index=[0, 0, 0, 1, 1, 1])

    # Sites
    buf = 0.25
    lat = np.linspace(np.nanmin(rup.lats) - buf, np.nanmax(rup.lats) + buf, 20)
    lon = np.linspace(np.nanmin(rup.lons) - buf, np.nanmax(rup.lons) + buf, 20)
    lons, lats = np.meshgrid(lon, lat)
    dep = np.zeros_like(lons)
    x, y = proj(lon, lat)
    rupx, rupy = proj(rup.lons, rup.lats)
    # Calculate U and T
    dtypes = ['U', 'T']
    dists = get_distance(dtypes, lats, lons, dep, rup)

    targetU = np.array(
        [[
            -28.53228275, -28.36479713, -28.20139732, -28.0407734,
            -27.88135558, -27.72144153, -27.55935946, -27.39362017,
            -27.22300147, -27.04653062, -26.86338215, -26.67275638,
            -26.47381287, -26.26569449, -26.04762427, -25.81902477,
            -25.57961136, -25.32943282, -25.06885791, -24.79852214
        ],
         [
             -23.53750292, -23.3748086, -23.21793537, -23.06521934,
             -22.91449689, -22.76331684, -22.60928211, -22.45042208,
             -22.28542121, -22.11355532, -21.93435402, -21.74720475,
             -21.55115107, -21.34497916, -21.12749377, -20.89781118,
             -20.6555466, -20.40086149, -20.13439948, -19.85716145
         ],
         [
             -18.53499939, -18.37689929, -18.22732841, -18.08427516,
             -17.94468687, -17.80472632, -17.66045115, -17.50880802,
             -17.3484421, -17.17963435, -17.0032098, -16.81921732,
             -16.62638972, -16.42258419, -16.20564846, -15.9741218,
             -15.72753538, -15.4663671, -15.19180844, -14.9054813
         ],
         [
             -13.52283359, -13.36797542, -13.22589288, -13.09466537,
             -12.97028551, -12.84653536, -12.71591089, -12.57212088,
             -12.41335561, -12.24319318, -12.06681006, -11.88598424,
             -11.69798166, -11.49796348, -11.28169605, -11.04691388,
             -10.79343174, -10.52262594, -10.23677602, -9.93851158
         ],
         [
             -8.49936685, -8.34357094, -8.20650964, -8.08786858, -7.98403171,
             -7.88628837, -7.78005273, -7.64833307, -7.48359988, -7.29992491,
             -7.11862682, -6.94410189, -6.76618701, -6.5727842, -6.35634881,
             -6.11465447, -5.84925708, -5.56369035, -5.26212482, -4.94857454
         ],
         [
             -3.46638168, -3.30047216, -3.15914418, -3.04618465, -2.96252939,
             -2.90194067, -2.84436315, -2.75029014, -2.56983592, -2.33744275,
             -2.1512136, -1.99833104, -1.84066354, -1.6541107, -1.43071517,
             -1.17252753, -0.88592286, -0.57817222, -0.25582315, 0.07585567
         ],
         [
             1.56416954, 1.75393848, 1.9183586, 2.04909316, 2.13723278,
             2.17776584, 2.18272501, 2.20967639, 2.37405656, 2.65073289,
             2.80205222, 2.90973407, 3.05124404, 3.2505182, 3.50336116,
             3.7967575, 4.11742779, 4.45465822, 4.80070204, 5.15033407
         ],
         [
             6.5633489, 6.78740885, 6.99419348, 7.17551069, 7.31963558,
             7.4113505, 7.43666779, 7.40177458, 7.40517136, 7.58520044,
             7.62013169, 7.71596777, 7.90558457, 8.17213015, 8.49008681,
             8.83763176, 9.19937294, 9.56556659, 9.9305469, 10.29132309
         ],
         [
             11.48996073, 11.74301446, 11.99016964, 12.22782156, 12.44984059,
             12.6446727, 12.78798484, 12.82584849, 12.61992833, 12.26579742,
             12.32166685, 12.54665462, 12.86628045, 13.23578462, 13.62571822,
             14.01882924, 14.40617707, 14.78388296, 15.15089889, 15.5076165
         ],
         [
             16.31383216, 16.57376544, 16.83189511, 17.08626411, 17.33309437,
             17.56429108, 17.76005623, 17.85853532, 17.57101025, 17.32637346,
             17.45075419, 17.77199513, 18.16933168, 18.58284635, 18.9891851,
             19.37985879, 19.75324557, 20.11079653, 20.4549905, 20.78837053
         ],
         [
             21.03975749, 21.28450315, 21.5243142, 21.75603974, 21.97469496,
             22.17298057, 22.34310053, 22.49668569, 22.73940191, 22.70030633,
             22.95351405, 23.35967832, 23.75891016, 24.14867803, 24.51536915,
             24.85878249, 25.18398203, 25.49615514, 25.79932964, 26.09638269
         ],
         [
             25.70484089, 25.92709225, 26.14280395, 26.35119497, 26.55363501,
             26.75827099, 26.9915523, 27.31779086, 27.77993211, 27.71070831,
             28.13624949, 28.723482, 29.25285078, 29.66404032, 30.00169474,
             30.30044315, 30.57916576, 30.84804427, 31.1126134, 31.37586841
         ],
         [
             30.35406633, 30.5585145, 30.75843356, 30.95627127, 31.15811912,
             31.3763124, 31.63114968, 31.94156189, 32.23691802, 32.38759301,
             32.86915665, 33.83467935, 34.46125278, 34.89905345, 35.25111257,
             35.55095664, 35.82150686, 36.07720619, 36.32643896, 36.57385362
         ],
         [
             35.0222379, 35.21734711, 35.41081942, 35.60589495, 35.80774808,
             36.02313791, 36.25826988, 36.51619168, 36.81025966, 37.21777129,
             37.86674108, 38.66578072, 39.25203723, 39.78060643, 40.20815617,
             40.5606039, 40.86634527, 41.14457482, 41.40732554, 41.66197722
         ],
         [
             39.73046099, 39.92514041, 40.12152415, 40.32316112, 40.5350467,
             40.76393316, 41.01937758, 41.3172128, 41.68596492, 42.16604148,
             42.77622755, 43.447503, 44.03771478, 44.55012468, 45.00551259,
             45.40376857, 45.75505135, 46.07204699, 46.36554362, 46.64361367
         ],
         [
             44.4876174, 44.68959464, 44.89710008, 45.11420443, 45.34646809,
             45.60143197, 45.88932906, 46.22363997, 46.61975585, 47.0884227,
             47.62307543, 48.1913408, 48.74937117, 49.26945799, 49.74327902,
             50.17123158, 50.55810895, 50.91098842, 51.23731582, 51.54375617
         ],
         [
             49.29279265, 49.50696882, 49.73006999, 49.96625305, 50.22080319,
             50.50022572, 50.81209441, 51.1642666, 51.56290694, 52.00913021,
             52.49553006, 53.00565389, 53.51861282, 54.01614414, 54.48672101,
             54.9254339, 55.33212663, 55.70951516, 56.06170563, 56.39317058
         ],
         [
             54.13906629, 54.3671694, 54.60643024, 54.86053563, 55.13377911,
             55.43088558, 55.75658576, 56.1148189, 56.50752978, 56.93329478,
             57.38640012, 57.85715119, 58.33367994, 58.80451404, 59.26065475,
             59.69644542, 60.10938419, 60.49940252, 60.86803179, 61.21767916
         ],
         [
             59.01741908, 59.25887491, 59.51248349, 59.78119592, 60.06816694,
             60.37651862, 60.70895927, 61.0672529, 61.45160192, 61.86010542,
             62.28853397, 62.73062937, 63.17894547, 63.62598375, 64.06523791,
             64.49185106, 64.90281064, 65.2967858, 65.67377362, 66.03469546
         ],
         [
             63.9193099, 64.17236414, 64.4376317, 64.71732366, 65.01362255,
             65.32847988, 65.66334836, 66.0188704, 66.39457546, 66.7886684,
             67.19800022, 67.61828012, 68.04451487, 68.47157851, 68.89476917,
             69.31022713, 69.71515194, 70.10782673, 70.4875021, 70.85420436
         ]])
    np.testing.assert_allclose(targetU, dists['U'], atol=0.01)
    targetT = np.array([
        [
            -2.27427469e+01, -1.97498544e+01, -1.67512900e+01, -1.37464632e+01,
            -1.07350712e+01, -7.71715083e+00, -4.69305811e+00, -1.66336318e+00,
            1.37131605e+00, 4.41047613e+00, 7.45381136e+00, 1.05011799e+01,
            1.35524779e+01, 1.66074913e+01, 1.96657949e+01, 2.27267294e+01,
            2.57894503e+01, 2.88530154e+01, 3.19164798e+01, 3.49789747e+01
        ],
        [
            -2.30778766e+01, -2.00896906e+01, -1.70950973e+01, -1.40931667e+01,
            -1.10834219e+01, -8.06600712e+00, -5.04171582e+00, -2.01179123e+00,
            1.02248614e+00, 4.06025218e+00, 7.10129626e+00, 1.01459367e+01,
            1.31946312e+01, 1.62475702e+01, 1.93044511e+01, 2.23644788e+01,
            2.54265185e+01, 2.84892997e+01, 3.15515954e+01, 3.46123426e+01
        ],
        [
            -2.33971472e+01, -2.04144525e+01, -1.74245193e+01, -1.44256870e+01,
            -1.14169177e+01, -8.39830615e+00, -5.37141115e+00, -2.33902937e+00,
            6.95823925e-01, 3.73133431e+00, 6.76769593e+00, 9.80663091e+00,
            1.28500821e+01, 1.58991008e+01, 1.89534737e+01, 2.20119662e+01,
            2.50728111e+01, 2.81341606e+01, 3.11943854e+01, 3.42522163e+01
        ],
        [
            -2.36965870e+01, -2.07206976e+01, -1.77370901e+01, -1.47426715e+01,
            -1.17347885e+01, -8.71247709e+00, -5.67801094e+00, -2.63761285e+00,
            4.00625914e-01, 3.43182302e+00, 6.45782532e+00, 9.48491128e+00,
            1.25187545e+01, 1.55616657e+01, 1.86127822e+01, 2.16694756e+01,
            2.47286680e+01, 2.77876297e+01, 3.08443066e+01, 3.38973527e+01
        ],
        [
            -2.39698399e+01, -2.10022612e+01, -1.80281475e+01, -1.50423801e+01,
            -1.20388157e+01, -9.01204040e+00, -5.96160398e+00, -2.89867328e+00,
            1.52194374e-01, 3.17268218e+00, 6.17334725e+00, 9.17699572e+00,
            1.21964990e+01, 1.52330975e+01, 1.82821226e+01, 2.13375815e+01,
            2.43943933e+01, 2.74490375e+01, 3.04994435e+01, 3.35446330e+01
        ],
        [
            -2.42070742e+01, -2.12471979e+01, -1.82855675e+01, -1.53163304e+01,
            -1.23296744e+01, -9.31127857e+00, -6.24535210e+00, -3.12882361e+00,
            -2.24460581e-02, 2.95354485e+00, 5.89215412e+00, 8.86387424e+00,
            1.18748249e+01, 1.49128245e+01, 1.79640055e+01, 2.10182501e+01,
            2.40696313e+01, 2.71153177e+01, 3.01543919e+01, 3.31869788e+01
        ],
        [
            -2.43971375e+01, -2.14368866e+01, -1.84826148e+01, -1.55321207e+01,
            -1.25786621e+01, -9.60654678e+00, -6.58612151e+00, -3.48118311e+00,
            -3.16555025e-01, 2.61618307e+00, 5.53740540e+00, 8.52666510e+00,
            1.15623361e+01, 1.46149780e+01, 1.76674294e+01, 2.07125025e+01,
            2.37483764e+01, 2.67756033e+01, 2.97955606e+01, 3.28097430e+01
        ],
        [
            -2.45384925e+01, -2.15583842e+01, -1.85874288e+01, -1.56290738e+01,
            -1.26867853e+01, -9.76140655e+00, -6.84407754e+00, -3.90089971e+00,
            -8.41806596e-01, 2.14754495e+00, 5.18583472e+00, 8.26271822e+00,
            1.13266091e+01, 1.43684333e+01, 1.73916223e+01, 2.04017469e+01,
            2.34034936e+01, 2.64002111e+01, 2.93941282e+01, 3.23866586e+01
        ],
        [
            -2.46576775e+01, -2.16355610e+01, -1.86129545e+01, -1.55919156e+01,
            -1.25763765e+01, -9.57306672e+00, -6.59044329e+00, -3.62352541e+00,
            -5.92041388e-01, 2.33255341e+00, 5.29498494e+00, 8.24834463e+00,
            1.11833819e+01, 1.41167617e+01, 1.70571082e+01, 2.00065102e+01,
            2.29645946e+01, 2.59302937e+01, 2.89023967e+01, 3.18797332e+01
        ],
        [
            -2.48161623e+01, -2.17489533e+01, -1.86651328e+01, -1.55589864e+01,
            -1.24224388e+01, -9.24466730e+00, -6.01521475e+00, -2.75148770e+00,
            3.89519039e-01, 2.99589525e+00, 5.45696689e+00, 8.01247078e+00,
            1.07291540e+01, 1.35565782e+01, 1.64461360e+01, 1.93723515e+01,
            2.23222250e+01, 2.52881249e+01, 2.82650171e+01, 3.12494172e+01
        ],
        [
            -2.50857405e+01, -2.20002811e+01, -1.88926336e+01, -1.57550887e+01,
            -1.25770789e+01, -9.34497451e+00, -6.04430316e+00, -2.67290100e+00,
            5.40854953e-01, 2.30509492e+00, 3.58183843e+00, 6.23701436e+00,
            9.28727128e+00, 1.23205706e+01, 1.53428945e+01, 1.83666035e+01,
            2.13934954e+01, 2.44218171e+01, 2.74496472e+01, 3.04757209e+01
        ],
        [
            -2.55082697e+01, -2.24454912e+01, -1.93710045e+01, -1.62824768e+01,
            -1.31767102e+01, -1.00469827e+01, -6.86985653e+00, -3.54681638e+00,
            1.07062999e-01, 3.34891657e-01, -1.70694750e-01, 3.57896940e+00,
            7.17013928e+00, 1.05232789e+01, 1.37976070e+01, 1.70230221e+01,
            2.02076136e+01, 2.33576919e+01, 2.64794914e+01, 2.95785985e+01
        ],
        [
            -2.60778515e+01, -2.30695744e+01, -2.00684150e+01, -1.70790651e+01,
            -1.41074315e+01, -1.11587507e+01, -8.23273307e+00, -5.33306966e+00,
            -2.80144302e+00, -1.84760416e+00, -1.05368779e+00, 1.26163211e+00,
            4.90086292e+00, 8.53883059e+00, 1.20996577e+01, 1.55589098e+01,
            1.89237978e+01, 2.22114952e+01, 2.54390313e+01, 2.86203790e+01
        ],
        [
            -2.67537229e+01, -2.38123298e+01, -2.08964272e+01, -1.80168638e+01,
            -1.51896230e+01, -1.24401995e+01, -9.81536176e+00, -7.41008520e+00,
            -5.38073414e+00, -3.78262975e+00, -2.29669890e+00, -3.53057240e-01,
            3.13642477e+00, 6.97021789e+00, 1.07026969e+01, 1.42945488e+01,
            1.77655640e+01, 2.11406146e+01, 2.44409375e+01, 2.76832489e+01
        ],
        [
            -2.74832153e+01, -2.46028623e+01, -2.17593854e+01, -1.89653378e+01,
            -1.62381218e+01, -1.36022404e+01, -1.10914555e+01, -8.74572618e+00,
            -6.58963863e+00, -4.58336507e+00, -2.57607747e+00, -2.67233150e-01,
            2.82788692e+00, 6.36737407e+00, 9.93334021e+00, 1.34440609e+01,
            1.68846862e+01, 2.02577163e+01, 2.35710668e+01, 2.68337230e+01
        ],
        [
            -2.82199728e+01, -2.53838486e+01, -2.25869234e+01, -1.98388981e+01,
            -1.71512612e+01, -1.45365893e+01, -1.20059297e+01, -9.56220853e+00,
            -7.18799023e+00, -4.83006994e+00, -2.39120744e+00, 2.51308627e-01,
            3.17331949e+00, 6.33022626e+00, 9.61428455e+00, 1.29426788e+01,
            1.62705993e+01, 1.95770961e+01, 2.28539081e+01, 2.60992146e+01
        ],
        [
            -2.89332200e+01, -2.61222251e+01, -2.33461951e+01, -2.06105222e+01,
            -1.79200485e+01, -1.52776479e+01, -1.26817390e+01, -1.01225741e+01,
            -7.57801870e+00, -5.01122873e+00, -2.37434916e+00, 3.78303328e-01,
            3.27093827e+00, 6.29527723e+00, 9.41912399e+00, 1.26046423e+01,
            1.58204753e+01, 1.90448689e+01, 2.22643265e+01, 2.54712657e+01
        ],
        [
            -2.96082809e+01, -2.68067500e+01, -2.40331802e+01, -2.12894659e+01,
            -1.85760763e+01, -1.58910124e+01, -1.32284735e+01, -1.05774862e+01,
            -7.92111801e+00, -5.23724922e+00, -2.50179068e+00, 3.05790568e-01,
            3.19666197e+00, 6.16975035e+00, 9.21353475e+00, 1.23109519e+01,
            1.54443017e+01, 1.85982825e+01, 2.17611016e+01, 2.49243957e+01
        ],
        [
            -3.02420504e+01, -2.74395034e+01, -2.46578094e+01, -2.18967353e+01,
            -1.91546206e+01, -1.64278219e+01, -1.37101816e+01, -1.09927140e+01,
            -8.26378719e+00, -5.51007519e+00, -2.71836365e+00, 1.22111758e-01,
            3.01754598e+00, 5.96851903e+00, 8.97043180e+00, 1.20150997e+01,
            1.50927299e+01, 1.81935916e+01, 2.13090724e+01, 2.44321477e+01
        ],
        [
            -3.08377073e+01, -2.80281994e+01, -2.52335334e+01, -2.24524366e+01,
            -1.96825082e+01, -1.69199811e+01, -1.41595768e+01, -1.13945492e+01,
            -8.61701306e+00, -5.81861191e+00, -2.99148017e+00, -1.29317230e-01,
            2.77170749e+00, 5.71249079e+00, 8.69110042e+00, 1.17033684e+01,
            1.47437429e+01, 1.78061436e+01, 2.08846464e+01, 2.39739290e+01
        ]
    ])
    np.testing.assert_allclose(targetT, dists['T'], atol=0.01)
예제 #30
0
def test_ss3_m6():
    magnitude = 6.0
    dip = np.array([90])
    rake = 180.0
    width = np.array([15])
    rupx = np.array([0, 0])
    rupy = np.array([0, 80])
    zp = np.array([0])
    epix = np.array([0])
    epiy = np.array([0.2 * rupy[1]])

    # Convert to lat/lon
    proj = geo.utils.get_orthographic_projection(-122, -120, 39, 37)
    tlon, tlat = proj(rupx, rupy, reverse=True)
    epilon, epilat = proj(epix, epiy, reverse=True)

    # Origin:
    origin = Origin({
        'lat': epilat[0],
        'lon': epilon[0],
        'depth': 10,
        'mag': magnitude,
        'eventsourcecode': 'ss3',
        'rake': rake
    })

    rup = QuadRupture.fromTrace(np.array([tlon[0]]),
                                np.array([tlat[0]]),
                                np.array([tlon[1]]),
                                np.array([tlat[1]]),
                                zp,
                                width,
                                dip,
                                origin,
                                reference='ss3')

    x = np.linspace(0, 20, 6)
    y = np.linspace(0, 90, 11)
    site_x, site_y = np.meshgrid(x, y)
    slon, slat = proj(site_x, site_y, reverse=True)
    deps = np.zeros_like(slon)

    test1 = Bayless2013(origin, rup, slat, slon, deps, T=1.0)

    # Test fd
    fd = test1.getFd()
    fd_test = np.array([[
        0.05853668, 0.05032323, 0.0306438, 0.00839635, -0.01102162, -0.02621319
    ],
                        [
                            0.01720501, -0.00687296, -0.03804823, -0.05547473,
                            -0.0644932, -0.06947135
                        ],
                        [
                            -0.03000065, -0.07006634, -0.07708165, -0.07865941,
                            -0.0792369, -0.07950887
                        ],
                        [
                            0.0398062, 0.02571145, -0.0018651, -0.0255418,
                            -0.04176278, -0.05235095
                        ],
                        [
                            0.0696989, 0.06389524, 0.04890304, 0.02983134,
                            0.01098535, -0.00545921
                        ],
                        [
                            0.088278, 0.08511069, 0.07628596, 0.06350294,
                            0.04875897, 0.03373495
                        ],
                        [
                            0.10179334, 0.09978475, 0.09401676, 0.0851842,
                            0.07422509, 0.06210369
                        ],
                        [
                            0.11242209, 0.11102701, 0.10696056, 0.10055471,
                            0.09229027, 0.08271454
                        ],
                        [
                            0.12118279, 0.12015315, 0.11712653, 0.11228058,
                            0.10588323, 0.09825795
                        ],
                        [
                            0.12785957, 0.12706892, 0.12473264, 0.12095384,
                            0.11589197, 0.10974684
                        ],
                        [
                            0.12785908, 0.12724852, 0.12543819, 0.12249026,
                            0.11850249, 0.11360047
                        ]])
    np.testing.assert_allclose(fd, fd_test, rtol=1e-4)
예제 #31
0
def test_ss3():
    magnitude = 7.2
    dip = np.array([90])
    rake = 180.0
    width = np.array([15])
    rupx = np.array([0, 0])
    rupy = np.array([0, 80])
    zp = np.array([0])
    epix = np.array([0])
    epiy = np.array([0.2 * rupy[1]])

    # Convert to lat/lon
    proj = geo.utils.get_orthographic_projection(-122, -120, 39, 37)
    tlon, tlat = proj(rupx, rupy, reverse=True)
    epilon, epilat = proj(epix, epiy, reverse=True)

    # Origin:
    origin = Origin({'lat': epilat[0],
                     'lon': epilon[0],
                     'depth': 10,
                     'mag': magnitude,
                     'eventsourcecode': 'ss3',
                     'rake': rake})

    rup = QuadRupture.fromTrace(
        np.array([tlon[0]]), np.array([tlat[0]]),
        np.array([tlon[1]]), np.array([tlat[1]]),
        zp, width, dip, origin, reference='ss3')

    x = np.linspace(-60, 60, 21)
    y = np.linspace(-60, 138, 34)
    site_x, site_y = np.meshgrid(x, y)
    slon, slat = proj(site_x, site_y, reverse=True)
    deps = np.zeros_like(slon)

    test1 = Bayless2013(origin, rup, slat, slon, deps, T=1.0)

    # Test fd
    fd = test1.getFd()
    fd_test = np.array(
        [[0.00000000e+00, 0.00000000e+00, 2.14620746e-03,
          6.47899336e-03, 1.23119791e-02, 1.91676140e-02,
          2.64009788e-02, 3.32427846e-02, 3.88863288e-02,
          4.26104002e-02, 4.39120296e-02, 4.26104002e-02,
          3.88863288e-02, 3.32427846e-02, 2.64009788e-02,
          1.91676140e-02, 1.23119791e-02, 6.47899336e-03,
          2.14620746e-03, 0.00000000e+00, 0.00000000e+00],
         [0.00000000e+00, 8.57780996e-04, 3.99405791e-03,
          9.31948105e-03, 1.65406113e-02, 2.51316805e-02,
          3.43205435e-02, 4.31274592e-02, 5.04747209e-02,
          5.53634169e-02, 5.70796092e-02, 5.53634169e-02,
          5.04747209e-02, 4.31274592e-02, 3.43205435e-02,
          2.51316805e-02, 1.65406113e-02, 9.31948105e-03,
          3.99405791e-03, 8.57780996e-04, 0.00000000e+00],
            [-7.32594549e-04, 1.80425497e-04, 3.76908220e-03,
             1.00175179e-02, 1.86854835e-02, 2.92291145e-02,
             4.07487277e-02, 5.20057177e-02, 6.15509770e-02,
             6.79776087e-02, 7.02477931e-02, 6.79776087e-02,
             6.15509770e-02, 5.20057177e-02, 4.07487277e-02,
             2.92291145e-02, 1.86854835e-02, 1.00175179e-02,
             3.76908220e-03, 1.80425497e-04, -7.32594549e-04],
            [-3.29238561e-03, -2.60643191e-03, 1.16635260e-03,
             8.15185259e-03, 1.82290773e-02, 3.08983182e-02,
             4.51608038e-02, 5.94769126e-02, 7.18919113e-02,
             8.03888307e-02, 8.34165399e-02, 8.03888307e-02,
             7.18919113e-02, 5.94769126e-02, 4.51608038e-02,
             3.08983182e-02, 1.82290773e-02, 8.15185259e-03,
             1.16635260e-03, -2.60643191e-03, -3.29238561e-03],
            [-7.68543266e-03, -7.63179286e-03, -4.08866637e-03,
             3.27605236e-03, 1.45558215e-02, 2.94068040e-02,
             4.68176355e-02, 6.49397159e-02, 7.72066272e-02,
             8.50445368e-02, 8.77974692e-02, 8.50445368e-02,
             7.72066272e-02, 6.49397159e-02, 4.68176355e-02,
             2.94068040e-02, 1.45558215e-02, 3.27605236e-03,
             -4.08866637e-03, -7.63179286e-03, -7.68543266e-03],
            [-1.38078234e-02, -1.49011067e-02, -1.21731364e-02,
             -5.02168047e-03, 6.98177526e-03, 2.38268531e-02,
             4.30419205e-02, 6.00041964e-02, 7.44541603e-02,
             8.42939552e-02, 8.77989590e-02, 8.42939552e-02,
             7.44541603e-02, 6.00041964e-02, 4.30419205e-02,
             2.38268531e-02, 6.98177526e-03, -5.02168047e-03,
             -1.21731364e-02, -1.49011067e-02, -1.38078234e-02],
            [-2.13780396e-02, -2.42165379e-02, -2.30613142e-02,
             -1.70011475e-02, -5.15036128e-03, 1.25885635e-02,
             3.24536739e-02, 5.25619351e-02, 7.05100243e-02,
             8.31900906e-02, 8.78003567e-02, 8.31900906e-02,
             7.05100243e-02, 5.25619351e-02, 3.24536739e-02,
             1.25885635e-02, -5.15036128e-03, -1.70011475e-02,
             -2.30613142e-02, -2.42165379e-02, -2.13780396e-02],
            [-2.98882710e-02, -3.50862342e-02, -3.63793490e-02,
             -3.25716319e-02, -2.22546618e-02, -3.59274163e-03,
             1.83064517e-02, 4.20112440e-02, 6.46115966e-02,
             8.14746164e-02, 8.78016623e-02, 8.14746164e-02,
             6.46115966e-02, 4.20112440e-02, 1.83064517e-02,
             -3.59274163e-03, -2.22546618e-02, -3.25716319e-02,
             -3.63793490e-02, -3.50862342e-02, -2.98882710e-02],
            [-3.85810679e-02, -4.66488633e-02, -5.12430987e-02,
             -5.10089462e-02, -4.20856023e-02, -2.36905234e-02,
             -6.33876287e-04, 2.66765430e-02, 5.53289928e-02,
             7.86066125e-02, 8.78028757e-02, 7.86066125e-02,
             5.53289928e-02, 2.66765430e-02, -6.33876287e-04,
             -2.36905234e-02, -4.20856023e-02, -5.10089462e-02,
             -5.12430987e-02, -4.66488633e-02, -3.85810679e-02],
            [-4.64803335e-02, -5.76615888e-02, -6.61458422e-02,
             -7.06512643e-02, -6.38427394e-02, -4.77258398e-02,
             -2.55483969e-02, 4.05840724e-03, 3.98470070e-02,
             7.33053399e-02, 8.78039969e-02, 7.33053399e-02,
             3.98470070e-02, 4.05840724e-03, -2.55483969e-02,
             -4.77258398e-02, -6.38427394e-02, -7.06512643e-02,
             -6.61458422e-02, -5.76615888e-02, -4.64803335e-02],
            [-5.25038299e-02, -6.66129442e-02, -7.90147081e-02,
             -8.87629178e-02, -8.59653118e-02, -7.42828398e-02,
             -5.64316505e-02, -2.87083225e-02, 1.25945312e-02,
             6.19971667e-02, 8.78050260e-02, 6.19971667e-02,
             1.25945312e-02, -2.87083225e-02, -5.64316505e-02,
             -7.42828398e-02, -8.59653118e-02, -8.87629178e-02,
             -7.90147081e-02, -6.66129442e-02, -5.25038299e-02],
            [-5.69779111e-02, -7.36791817e-02, -8.97495345e-02,
             -1.04799583e-01, -1.07737239e-01, -1.02875880e-01,
             -9.46568471e-02, -7.95630162e-02, -4.96285112e-02,
             6.59954795e-03, 5.25569882e-02, 6.59954795e-03,
             -4.96285112e-02, -7.95630162e-02, -9.46568471e-02,
             -1.02875880e-01, -1.07737239e-01, -1.04799583e-01,
             -8.97495345e-02, -7.36791817e-02, -5.69779111e-02],
            [-5.90357675e-02, -7.69727119e-02, -9.48442826e-02,
             -1.12607620e-01, -1.18744885e-01, -1.18201834e-01,
             -1.17217017e-01, -1.15152899e-01, -1.09694433e-01,
             -8.82341332e-02, -1.61624035e-02, -8.82341332e-02,
             -1.09694433e-01, -1.15152899e-01, -1.17217017e-01,
             -1.18201834e-01, -1.18744885e-01, -1.12607620e-01,
             -9.48442826e-02, -7.69727119e-02, -5.90357675e-02],
            [-5.92189452e-02, -7.72680305e-02, -9.53051857e-02,
             -1.13322519e-01, -1.19770917e-01, -1.19670660e-01,
             -1.19486798e-01, -1.19092639e-01, -1.17989113e-01,
             -1.12555820e-01, -4.50009776e-02, -1.12555820e-01,
             -1.17989113e-01, -1.19092639e-01, -1.19486798e-01,
             -1.19670660e-01, -1.19770917e-01, -1.13322519e-01,
             -9.53051857e-02, -7.72680305e-02, -5.92189452e-02],
            [-5.79249958e-02, -7.51927112e-02, -9.20842554e-02,
             -1.08361430e-01, -1.12722790e-01, -1.09732675e-01,
             -1.04531672e-01, -9.44729544e-02, -7.23277773e-02,
             -2.05699911e-02, 3.58249631e-02, -2.05699911e-02,
             -7.23277773e-02, -9.44729544e-02, -1.04531672e-01,
             -1.09732675e-01, -1.12722790e-01, -1.08361430e-01,
             -9.20842554e-02, -7.51927112e-02, -5.79249958e-02],
            [-5.42527703e-02, -6.93641123e-02, -8.31684773e-02,
             -9.49114165e-02, -9.41989454e-02, -8.48645354e-02,
             -7.00894708e-02, -4.58286259e-02, -6.37563061e-03,
             4.68887998e-02, 7.77968419e-02, 4.68887998e-02,
             -6.37563061e-03, -4.58286259e-02, -7.00894708e-02,
             -8.48645354e-02, -9.41989454e-02, -9.49114165e-02,
             -8.31684773e-02, -6.93641123e-02, -5.42527703e-02],
            [-4.82490057e-02, -5.99997941e-02, -6.91786120e-02,
             -7.44891242e-02, -6.73705808e-02, -5.13001284e-02,
             -2.84188057e-02, 3.60143816e-03, 4.47470123e-02,
             8.58663851e-02, 1.04548354e-01, 8.58663851e-02,
             4.47470123e-02, 3.60143816e-03, -2.84188057e-02,
             -5.13001284e-02, -6.73705808e-02, -7.44891242e-02,
             -6.91786120e-02, -5.99997941e-02, -4.82490057e-02],
            [-4.03203010e-02, -4.79063206e-02, -5.16352259e-02,
             -4.98707253e-02, -3.67295509e-02, -1.57342058e-02,
             1.13668830e-02, 4.46551184e-02, 8.10450840e-02,
             1.11780747e-01, 1.24226598e-01, 1.11780747e-01,
             8.10450840e-02, 4.46551184e-02, 1.13668830e-02,
             -1.57342058e-02, -3.67295509e-02, -4.98707253e-02,
             -5.16352259e-02, -4.79063206e-02, -4.03203010e-02],
            [-3.10250239e-02, -3.40796094e-02, -3.22089254e-02,
             -2.37094100e-02, -5.85463114e-03, 1.77402761e-02,
             4.57786845e-02, 7.69637052e-02, 1.07537652e-01,
             1.30906328e-01, 1.39800436e-01, 1.30906328e-01,
             1.07537652e-01, 7.69637052e-02, 4.57786845e-02,
             1.77402761e-02, -5.85463114e-03, -2.37094100e-02,
             -3.22089254e-02, -3.40796094e-02, -3.10250239e-02],
            [-2.09301700e-02, -1.94475962e-02, -1.22970199e-02,
             2.07296407e-03, 2.31516868e-02, 4.74574033e-02,
             7.44743481e-02, 1.02380049e-01, 1.27776301e-01,
             1.46003379e-01, 1.52690015e-01, 1.46003379e-01,
             1.27776301e-01, 1.02380049e-01, 7.44743481e-02,
             4.74574033e-02, 2.31516868e-02, 2.07296407e-03,
             -1.22970199e-02, -1.94475962e-02, -2.09301700e-02],
            [-1.05257992e-02, -4.74329696e-03, 7.12107274e-03,
             2.63431361e-02, 4.93709790e-02, 7.31527220e-02,
             9.82233938e-02, 1.22728059e-01, 1.43894925e-01,
             1.58465026e-01, 1.63685984e-01, 1.58465026e-01,
             1.43894925e-01, 1.22728059e-01, 9.82233938e-02,
             7.31527220e-02, 4.93709790e-02, 2.63431361e-02,
             7.12107274e-03, -4.74329696e-03, -1.05257992e-02],
            [-1.89098657e-04, 9.52392382e-03, 2.54577716e-02,
             4.85730869e-02, 7.26048516e-02, 9.51726659e-02,
             1.17988523e-01, 1.39380421e-01, 1.57176612e-01,
             1.69076915e-01, 1.73274075e-01, 1.69076915e-01,
             1.57176612e-01, 1.39380421e-01, 1.17988523e-01,
             9.51726659e-02, 7.26048516e-02, 4.85730869e-02,
             2.54577716e-02, 9.52392382e-03, -1.89098657e-04],
            [9.81732797e-03, 2.30419581e-02, 4.24234701e-02,
             6.86213308e-02, 9.30164618e-02, 1.14050063e-01,
             1.34620894e-01, 1.53304069e-01, 1.68420867e-01,
             1.78321253e-01, 1.81774183e-01, 1.78321253e-01,
             1.68420867e-01, 1.53304069e-01, 1.34620894e-01,
             1.14050063e-01, 9.30164618e-02, 6.86213308e-02,
             4.24234701e-02, 2.30419581e-02, 9.81732797e-03],
            [1.93290725e-02, 3.56493099e-02, 5.79271157e-02,
             8.65611122e-02, 1.10914315e-01, 1.30317702e-01,
             1.48798006e-01, 1.65173224e-01, 1.78147031e-01,
             1.86513895e-01, 1.89408199e-01, 1.86513895e-01,
             1.78147031e-01, 1.65173224e-01, 1.48798006e-01,
             1.30317702e-01, 1.10914315e-01, 8.65611122e-02,
             5.79271157e-02, 3.56493099e-02, 1.93290725e-02],
            [2.68168937e-02, 4.52356810e-02, 6.92261217e-02,
             9.89630241e-02, 1.23093435e-01, 1.40640067e-01,
             1.56998943e-01, 1.71215219e-01, 1.82297185e-01,
             1.89360704e-01, 1.91789146e-01, 1.89360704e-01,
             1.82297185e-01, 1.71215219e-01, 1.56998943e-01,
             1.40640067e-01, 1.23093435e-01, 9.89630241e-02,
             6.92261217e-02, 4.52356810e-02, 2.68168937e-02],
            [3.19403269e-02, 5.15051953e-02, 7.61032066e-02,
             1.05705197e-01, 1.31722206e-01, 1.47466588e-01,
             1.61892450e-01, 1.74235616e-01, 1.83735386e-01,
             1.89735533e-01, 1.91788616e-01, 1.89735533e-01,
             1.83735386e-01, 1.74235616e-01, 1.61892450e-01,
             1.47466588e-01, 1.31722206e-01, 1.05705197e-01,
             7.61032066e-02, 5.15051953e-02, 3.19403269e-02],
            [3.48604070e-02, 5.49292382e-02, 7.94274234e-02,
             1.08149011e-01, 1.38923419e-01, 1.53070440e-01,
             1.65849067e-01, 1.76646162e-01, 1.84871647e-01,
             1.90029617e-01, 1.91787948e-01, 1.90029617e-01,
             1.84871647e-01, 1.76646162e-01, 1.65849067e-01,
             1.53070440e-01, 1.38923419e-01, 1.08149011e-01,
             7.94274234e-02, 5.49292382e-02, 3.48604070e-02],
            [3.53402022e-02, 5.53653759e-02, 7.91965502e-02,
             1.06486934e-01, 1.36563003e-01, 1.57713955e-01,
             1.69087164e-01, 1.78598269e-01, 1.85784340e-01,
             1.90264452e-01, 1.91787141e-01, 1.90264452e-01,
             1.85784340e-01, 1.78598269e-01, 1.69087164e-01,
             1.57713955e-01, 1.36563003e-01, 1.06486934e-01,
             7.91965502e-02, 5.53653759e-02, 3.53402022e-02],
            [3.32889822e-02, 5.28319225e-02, 7.55769079e-02,
             1.01077605e-01, 1.28592068e-01, 1.57023616e-01,
             1.71766715e-01, 1.80199729e-01, 1.86528091e-01,
             1.90454829e-01, 1.91786196e-01, 1.90454829e-01,
             1.86528091e-01, 1.80199729e-01, 1.71766715e-01,
             1.57023616e-01, 1.28592068e-01, 1.01077605e-01,
             7.55769079e-02, 5.28319225e-02, 3.32889822e-02],
            [2.87295370e-02, 4.74613283e-02, 6.88388861e-02,
             9.23568989e-02, 1.17254645e-01, 1.42483223e-01,
             1.66695764e-01, 1.81528776e-01, 1.87141877e-01,
             1.90611190e-01, 1.91785112e-01, 1.90611190e-01,
             1.87141877e-01, 1.81528776e-01, 1.66695764e-01,
             1.42483223e-01, 1.17254645e-01, 9.23568989e-02,
             6.88388861e-02, 4.74613283e-02, 2.87295370e-02],
            [2.17650266e-02, 3.94568191e-02, 5.93023344e-02,
             8.07720575e-02, 1.03124482e-01, 1.25394282e-01,
             1.46405870e-01, 1.64828303e-01, 1.79288925e-01,
             1.88553222e-01, 1.91747252e-01, 1.88553222e-01,
             1.79288925e-01, 1.64828303e-01, 1.46405870e-01,
             1.25394282e-01, 1.03124482e-01, 8.07720575e-02,
             5.93023344e-02, 3.94568191e-02, 2.17650266e-02],
            [1.25495284e-02, 2.90572166e-02, 4.72972116e-02,
             6.67423656e-02, 8.66951873e-02, 1.06290296e-01,
             1.24520131e-01, 1.40293247e-01, 1.52531693e-01,
             1.60303860e-01, 1.62970689e-01, 1.60303860e-01,
             1.52531693e-01, 1.40293247e-01, 1.24520131e-01,
             1.06290296e-01, 8.66951873e-02, 6.67423656e-02,
             4.72972116e-02, 2.90572166e-02, 1.25495284e-02],
            [1.26441934e-03, 1.65114811e-02, 3.31390978e-02,
             5.06407706e-02, 6.83765492e-02, 8.55839448e-02,
             1.01408074e-01, 1.14955639e-01, 1.25373662e-01,
             1.31946425e-01, 1.34193829e-01, 1.31946425e-01,
             1.25373662e-01, 1.14955639e-01, 1.01408074e-01,
             8.55839448e-02, 6.83765492e-02, 5.06407706e-02,
             3.31390978e-02, 1.65114811e-02, 1.26441934e-03],
            [0.00000000e+00, 2.06213867e-03, 1.71162845e-02,
             3.27888240e-02, 4.85026462e-02, 6.35932476e-02,
             7.73387997e-02, 8.90069217e-02, 9.79166934e-02,
             1.03509489e-01, 1.05416736e-01, 1.03509489e-01,
             9.79166934e-02, 8.90069217e-02, 7.73387997e-02,
             6.35932476e-02, 4.85026462e-02, 3.27888240e-02,
             1.71162845e-02, 2.06213867e-03, 0.00000000e+00]]
    )
    np.testing.assert_allclose(fd, fd_test, rtol=1e-4)
예제 #32
0
def test_rv4():
    magnitude = 7.0
    rake = 90.0
    width = np.array([28])
    rupx = np.array([0, 0])
    rupy = np.array([0, 32])
    zp = np.array([0])
    dip = np.array([30])

    # Convert to lat/lon
    proj = geo.utils.get_orthographic_projection(-122, -120, 39, 37)
    tlon, tlat = proj(rupx, rupy, reverse=True)

    # Dummy Origin
    origin = Origin({
        'lat': 0,
        'lon': 0,
        'depth': 0,
        'mag': 0,
        'eventsourcecode': 'rv4',
        'rake': rake
    })

    # Rupture
    rup = QuadRupture.fromTrace(np.array([tlon[0]]),
                                np.array([tlat[0]]),
                                np.array([tlon[1]]),
                                np.array([tlat[1]]),
                                zp,
                                width,
                                dip,
                                origin,
                                reference='')
    L = rup.getLength()

    # Figure out epicenter
    tmp = rup.getQuadrilaterals()[0]
    pp0 = Vector.fromPoint(
        point.Point(tmp[0].longitude, tmp[0].latitude, tmp[0].depth))
    pp1 = Vector.fromPoint(
        point.Point(tmp[1].longitude, tmp[1].latitude, tmp[1].depth))
    pp2 = Vector.fromPoint(
        point.Point(tmp[2].longitude, tmp[2].latitude, tmp[2].depth))
    pp3 = Vector.fromPoint(
        point.Point(tmp[3].longitude, tmp[3].latitude, tmp[3].depth))
    dxp = 6 / L
    dyp = (width - 8) / width
    mp0 = pp0 + (pp1 - pp0) * dxp
    mp1 = pp3 + (pp2 - pp3) * dxp
    rp = mp0 + (mp1 - mp0) * dyp
    epilat, epilon, epidepth = ecef2latlon(rp.x, rp.y, rp.z)

    # Fix Origin:
    origin = Origin({
        'lat': epilat,
        'lon': epilon,
        'depth': epidepth,
        'mag': magnitude,
        'eventsourcecode': 'rv4',
        'rake': rake
    })

    x = np.linspace(-50, 50, 11)
    y = np.linspace(-50, 50, 11)
    site_x, site_y = np.meshgrid(x, y)
    slon, slat = proj(site_x, site_y, reverse=True)
    deps = np.zeros_like(slon)

    test1 = Bayless2013(origin, rup, slat, slon, deps, T=2.0)

    # Test fd
    fd = test1.getFd()
    fd_test = np.array(
        [[
            0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 1.72143257e-03,
            1.34977260e-03, 4.33616224e-15, 1.24446253e-03, 1.16142357e-03,
            2.25464716e-03, 7.05281751e-04, 0.00000000e+00
        ],
         [
             0.00000000e+00, 0.00000000e+00, 7.62610242e-03, 1.25133844e-02,
             5.61896104e-03, 7.63126014e-15, 4.52266194e-03, 4.67970900e-03,
             1.02820316e-02, 5.13160096e-03, -6.13926251e-03
         ],
         [
             0.00000000e+00, 4.00495234e-03, 2.37608386e-02, 2.37139333e-02,
             9.55224050e-03, 5.66364910e-15, 7.70344813e-03, 7.36466362e-03,
             1.48239704e-02, 8.40388145e-03, -1.58592485e-02
         ],
         [
             8.08385547e-19, 9.38150101e-03, 3.38610620e-02, 3.85351492e-02,
             1.91044918e-02, 3.98697802e-15, 1.54321666e-02, 1.21913760e-02,
             2.04435166e-02, 1.04931859e-02, -1.85935894e-02
         ],
         [
             2.12025421e-18, 1.37316085e-02, 4.40193799e-02, 6.16562477e-02,
             4.77612496e-02, 2.60257085e-15, 3.86322888e-02, 1.97965887e-02,
             2.64882038e-02, 1.23335908e-02, -2.07389932e-02
         ],
         [
             2.64338576e-18, 1.45898292e-02, 4.89104213e-02, 7.70703166e-02,
             9.55225258e-02, 1.01875104e-01, 7.73459329e-02, 2.50275508e-02,
             2.93537540e-02, 1.30949577e-02, -2.15685454e-02
         ],
         [
             2.64330042e-18, 1.45898262e-02, 4.89104186e-02, 7.70703146e-02,
             9.55225248e-02, 1.01910945e-01, 7.74050835e-02, 2.52307946e-02,
             2.92970736e-02, 1.30880504e-02, -2.15685424e-02
         ],
         [
             2.64318867e-18, 1.45898259e-02, 4.89104184e-02, 7.70703144e-02,
             9.55225247e-02, 1.01933432e-01, 7.74421258e-02, 2.53572923e-02,
             2.92615130e-02, 1.30837284e-02, -2.15685422e-02
         ],
         [
             2.64305117e-18, 1.45898284e-02, 4.89104206e-02, 7.70703161e-02,
             9.55225256e-02, 1.01942593e-01, 7.74571359e-02, 2.54081640e-02,
             2.92472117e-02, 1.30819985e-02, -2.15685446e-02
         ],
         [
             2.30141673e-18, 1.40210825e-02, 4.56205547e-02, 6.63109661e-02,
             5.79266964e-02, 2.33044622e-15, 4.69672564e-02, 2.18401553e-02,
             2.72864925e-02, 1.25728575e-02, -2.10227772e-02
         ],
         [
             1.10672535e-18, 1.04777076e-02, 3.59041065e-02, 4.24614318e-02,
             2.24217216e-02, 3.66914762e-15, 1.81728517e-02, 1.39301504e-02,
             2.14956836e-02, 1.08711460e-02, -1.90802849e-02
         ]])
    np.testing.assert_allclose(fd, fd_test, rtol=2e-4)
예제 #33
0
def test_ss3_m6():
    magnitude = 6.0
    dip = np.array([90])
    rake = 180.0
    width = np.array([15])
    rupx = np.array([0, 0])
    rupy = np.array([0, 80])
    zp = np.array([0])
    epix = np.array([0])
    epiy = np.array([0.2 * rupy[1]])

    # Convert to lat/lon
    proj = geo.utils.get_orthographic_projection(-122, -120, 39, 37)
    tlon, tlat = proj(rupx, rupy, reverse=True)
    epilon, epilat = proj(epix, epiy, reverse=True)

    # Origin:
    origin = Origin({'lat': epilat[0],
                     'lon': epilon[0],
                     'depth': 10,
                     'mag': magnitude,
                     'eventsourcecode': 'ss3',
                     'rake': rake})

    rup = QuadRupture.fromTrace(
        np.array([tlon[0]]), np.array([tlat[0]]),
        np.array([tlon[1]]), np.array([tlat[1]]),
        zp, width, dip, origin, reference='ss3')

    x = np.linspace(0, 20, 6)
    y = np.linspace(0, 90, 11)
    site_x, site_y = np.meshgrid(x, y)
    slon, slat = proj(site_x, site_y, reverse=True)
    deps = np.zeros_like(slon)

    test1 = Bayless2013(origin, rup, slat, slon, deps, T=1.0)

    # Test fd
    fd = test1.getFd()
    fd_test = np.array(
        [[0.05853668,  0.05032323,  0.0306438,  0.00839635, -0.01102162,
          -0.02621319],
         [0.01720501, -0.00687296, -0.03804823, -0.05547473, -0.0644932,
            -0.06947135],
            [-0.03000065, -0.07006634, -0.07708165, -0.07865941, -0.0792369,
             -0.07950887],
            [0.0398062,  0.02571145, -0.0018651, -0.0255418, -0.04176278,
             -0.05235095],
            [0.0696989,  0.06389524,  0.04890304,  0.02983134,  0.01098535,
             -0.00545921],
            [0.088278,  0.08511069,  0.07628596,  0.06350294,  0.04875897,
             0.03373495],
            [0.10179334,  0.09978475,  0.09401676,  0.0851842,  0.07422509,
             0.06210369],
            [0.11242209,  0.11102701,  0.10696056,  0.10055471,  0.09229027,
             0.08271454],
            [0.12118279,  0.12015315,  0.11712653,  0.11228058,  0.10588323,
             0.09825795],
            [0.12785957,  0.12706892,  0.12473264,  0.12095384,  0.11589197,
             0.10974684],
            [0.12785908,  0.12724852,  0.12543819,  0.12249026,  0.11850249,
             0.11360047]])
    np.testing.assert_allclose(
        fd, fd_test, rtol=1e-4)
예제 #34
0
def test_ss3_move_hypo1():
    magnitude = 7.2
    dip = np.array([90])
    rake = 180.0
    width = np.array([15])
    rupx = np.array([0, 0])
    rupy = np.array([0, 80])
    zp = np.array([0.0])
    epix = np.array([1.0])
    epiy = np.array([-1.0])

    # Convert to lat/lon
    proj = geo.utils.get_orthographic_projection(-122, -120, 39, 37)
    tlon, tlat = proj(rupx, rupy, reverse=True)
    epilon, epilat = proj(epix, epiy, reverse=True)

    # Origin
    origin = Origin({'lat': epilat[0],
                     'lon': epilon[0],
                     'depth': -1,
                     'mag': magnitude,
                     'eventsourcecode': 'ss3',
                     'rake': rake})

    rup = QuadRupture.fromTrace(
        np.array([tlon[0]]), np.array([tlat[0]]),
        np.array([tlon[1]]), np.array([tlat[1]]),
        zp, width, dip, origin, reference='ss3')

    x = np.linspace(0, 20, 6)
    y = np.linspace(0, 90, 11)
    site_x, site_y = np.meshgrid(x, y)
    slon, slat = proj(site_x, site_y, reverse=True)
    deps = np.zeros_like(slon)

    test1 = Bayless2013(origin, rup, slat, slon, deps, T=1.0)
    phyp = copy.deepcopy(test1.phyp[0])
    plat, plon, pdep = ecef2latlon(phyp.x, phyp.y, phyp.z)

    px, py = proj(plon, plat, reverse=False)

    np.testing.assert_allclose(plat, 38.004233219183604, rtol=1e-4)
    np.testing.assert_allclose(plon, -120.98636122402166, rtol=1e-4)
    np.testing.assert_allclose(pdep, 7.4999999989205968, rtol=1e-4)

    # --------------------------------------------------------------------------
    # Also for multiple segments
    # --------------------------------------------------------------------------
    dip = np.array([90., 90., 90.])
    rake = 180.0
    width = np.array([15., 15., 10.])
    rupx = np.array([0., 0., 10., 20.])
    rupy = np.array([0., 20., 60., 80.])
    zp = np.array([0., 0., 0.])
    epix = np.array([0.])
    epiy = np.array([0.])

    # Convert to lat/lon
    proj = geo.utils.get_orthographic_projection(-122, -120, 39, 37)
    tlon, tlat = proj(rupx, rupy, reverse=True)
    epilon, epilat = proj(epix, epiy, reverse=True)

    rup = QuadRupture.fromTrace(
        np.array(tlon[0:3]), np.array(tlat[0:3]),
        np.array(tlon[1:4]), np.array(tlat[1:4]),
        zp, width, dip, origin, reference='')

    event = {'lat': epilat[0],
             'lon': epilon[0],
             'depth': 1.0,
             'mag': magnitude,
             'eventsourcecode': '',
             'locstring': 'test',
             'type': 'SS',
             'timezone': 'UTC'}
    event['time'] = HistoricTime.utcfromtimestamp(int(time.time()))
    event['created'] = HistoricTime.utcfromtimestamp(int(time.time()))
    x = np.linspace(0, 20, 6)
    y = np.linspace(0, 90, 11)
    site_x, site_y = np.meshgrid(x, y)
    slon, slat = proj(site_x, site_y, reverse=True)
    deps = np.zeros_like(slon)
    origin = Origin(event)
    origin.rake = rake
    test1 = Bayless2013(origin, rup, slat, slon, deps, T=1.0)

    # 1st pseudo-hyp
    phyp = copy.deepcopy(test1.phyp[0])
    plat, plon, pdep = ecef2latlon(phyp.x, phyp.y, phyp.z)
    px, py = proj(plon, plat, reverse=False)
    np.testing.assert_allclose(plat, 38.004233219183604, rtol=1e-4)
    np.testing.assert_allclose(plon, -120.98636122402166, rtol=1e-4)
    np.testing.assert_allclose(pdep, 7.4999999989205968, rtol=1e-4)

    # 2nd pseudo-hyp
    phyp = copy.deepcopy(test1.phyp[1])
    plat, plon, pdep = ecef2latlon(phyp.x, phyp.y, phyp.z)
    px, py = proj(plon, plat, reverse=False)
    np.testing.assert_allclose(plat, 38.184097835787796, rtol=1e-4)
    np.testing.assert_allclose(plon, -120.98636122402166, rtol=1e-4)
    np.testing.assert_allclose(pdep, 7.4999999989103525, rtol=1e-4)

    # 3rd pseudo-hyp
    phyp = copy.deepcopy(test1.phyp[2])
    plat, plon, pdep = ecef2latlon(phyp.x, phyp.y, phyp.z)
    px, py = proj(plon, plat, reverse=False)
    np.testing.assert_allclose(plat, 38.543778594535752, rtol=1e-4)
    np.testing.assert_allclose(plon, -120.87137783362499, rtol=1e-4)
    np.testing.assert_allclose(pdep, 4.9999999995063993, rtol=1e-4)
예제 #35
0
def test_rupture_depth(interactive=False):
    DIP = 17.0
    WIDTH = 20.0
    GRIDRES = 0.1

    names = ['single', 'double', 'triple',
             'concave', 'concave_simple', 'ANrvSA']
    means = [3.1554422780092461, 2.9224454569459781,
             3.0381968625073563, 2.0522694624400271,
             2.4805390352818755, 2.8740121776209673]
    stds = [2.1895293825074575, 2.0506459673526174,
            2.0244588429154402, 2.0112565876976416,
            2.1599789955270019, 1.6156220309120068]
    xp0list = [np.array([118.3]),
               np.array([10.1, 10.1]),
               np.array([10.1, 10.1, 10.3]),
               np.array([10.9, 10.5, 10.9]),
               np.array([10.9, 10.6]),
               np.array([-76.483, -76.626, -76.757, -76.99, -77.024, -76.925,
                         -76.65, -76.321, -75.997, -75.958])]
    xp1list = [np.array([118.3]),
               np.array([10.1, 10.3]),
               np.array([10.1, 10.3, 10.1]),
               np.array([10.5, 10.9, 11.3]),
               np.array([10.6, 10.9]),
               np.array([-76.626, -76.757, -76.99, -77.024, -76.925, -76.65,
                         -76.321, -75.997, -75.958, -76.006])]
    yp0list = [np.array([34.2]),
               np.array([34.2, 34.5]),
               np.array([34.2, 34.5, 34.8]),
               np.array([34.2, 34.5, 34.8]),
               np.array([35.1, 35.2]),
               np.array([-52.068, -51.377, -50.729, -49.845, -49.192, -48.507,
                         -47.875, -47.478, -47.08, -46.422])]
    yp1list = [np.array([34.5]),
               np.array([34.5, 34.8]),
               np.array([34.5, 34.8, 35.1]),
               np.array([34.5, 34.8, 34.6]),
               np.array([35.2, 35.4]),
               np.array([-51.377, -50.729, -49.845, -49.192, -48.507, -47.875,
                         -47.478, -47.08, -46.422, -45.659])]

    for i in range(0, len(xp0list)):
        xp0 = xp0list[i]
        xp1 = xp1list[i]
        yp0 = yp0list[i]
        yp1 = yp1list[i]
        name = names[i]
        mean_value = means[i]
        std_value = stds[i]

        zp = np.zeros(xp0.shape)
        strike = azimuth(xp0[0], yp0[0], xp1[-1], yp1[-1])
        widths = np.ones(xp0.shape) * WIDTH
        dips = np.ones(xp0.shape) * DIP
        strike = [strike]
        origin = Origin({'eventsourcecode': 'test', 'lat': 0, 'lon': 0,
                         'depth': 5.0, 'mag': 7.0})
        rupture = QuadRupture.fromTrace(
            xp0, yp0, xp1, yp1, zp, widths, dips, origin, strike=strike)

        # make a grid of points over both quads, ask for depths
        ymin = np.nanmin(rupture.lats)
        ymax = np.nanmax(rupture.lats)
        xmin = np.nanmin(rupture.lons)
        xmax = np.nanmax(rupture.lons)

        xmin = np.floor(xmin * (1 / GRIDRES)) / (1 / GRIDRES)
        xmax = np.ceil(xmax * (1 / GRIDRES)) / (1 / GRIDRES)
        ymin = np.floor(ymin * (1 / GRIDRES)) / (1 / GRIDRES)
        ymax = np.ceil(ymax * (1 / GRIDRES)) / (1 / GRIDRES)
        geodict = GeoDict.createDictFromBox(
            xmin, xmax, ymin, ymax, GRIDRES, GRIDRES)
        nx = geodict.nx
        ny = geodict.ny
        depths = np.zeros((ny, nx))
        for row in range(0, ny):
            for col in range(0, nx):
                lat, lon = geodict.getLatLon(row, col)
                depth = rupture.getDepthAtPoint(lat, lon)
                depths[row, col] = depth

        np.testing.assert_almost_equal(np.nanmean(depths), mean_value)
        np.testing.assert_almost_equal(np.nanstd(depths), std_value)

        if interactive:
            fig, axes = plt.subplots(nrows=2, ncols=1)
            ax1, ax2 = axes
            xdata = np.append(xp0, xp1[-1])
            ydata = np.append(yp0, yp1[-1])
            plt.sca(ax1)
            plt.plot(xdata, ydata, 'b')
            plt.sca(ax2)
            im = plt.imshow(depths, cmap='viridis_r')  # noqa
            ch = plt.colorbar()  # noqa
            fname = os.path.join(os.path.expanduser('~'),
                                 'quad_%s_test.png' % name)
            print('Saving image for %s quad test... %s' % (name, fname))
            plt.savefig(fname)
            plt.close()