Exemplo n.º 1
0
def to_csv_array(ruptures):
    """
    :param ruptures: a list of ruptures
    :returns: an array of ruptures suitable for serialization in CSV
    """
    if not code2cls:
        code2cls.update(BaseRupture.init())
    arr = numpy.zeros(len(ruptures), rupture_dt)
    for rec, rup in zip(arr, ruptures):
        arrays = surface_to_arrays(rup.surface)  # shape (3, s1, s2)
        rec['serial'] = rup.rup_id
        rec['mag'] = rup.mag
        rec['rake'] = rup.rake
        rec['lon'] = rup.hypocenter.x
        rec['lat'] = rup.hypocenter.y
        rec['dep'] = rup.hypocenter.z
        rec['multiplicity'] = rup.multiplicity
        rec['trt'] = rup.tectonic_region_type
        rec['kind'] = ' '.join(cls.__name__ for cls in code2cls[rup.code])
        rec['mesh'] = json.dumps([[[[float5(z) for z in y] for y in x]
                                   for x in array] for array in arrays])
        extra = {}
        if hasattr(rup, 'probs_occur'):
            extra['probs_occur'] = rup.probs_occur
        else:
            extra['occurrence_rate'] = rup.occurrence_rate
        if hasattr(rup, 'weight'):
            extra['weight'] = rup.weight
        _fixfloat32(extra)
        rec['extra'] = json.dumps(extra)
    return arr
Exemplo n.º 2
0
def get_rup_array(ebruptures, srcfilter=nofilter):
    """
    Convert a list of EBRuptures into a numpy composite array, by filtering
    out the ruptures far away from every site
    """
    if not BaseRupture._code:
        BaseRupture.init()  # initialize rupture codes

    rups = []
    geoms = []
    for ebrupture in ebruptures:
        rup = ebrupture.rupture
        arrays = surface_to_arrays(rup.surface)  # one array per surface
        points = []
        shapes = []
        for array in arrays:
            s0, s1, s2 = array.shape
            assert s0 == 3, s0
            assert s1 < TWO16, 'Too many lines'
            assert s2 < TWO16, 'The rupture mesh spacing is too small'
            shapes.append(s1)
            shapes.append(s2)
            points.extend(array.flat)
            # example of points: [25.0, 25.1, 25.1, 25.0,
            #                     -24.0, -24.0, -24.1, -24.1,
            #                      5.0, 5.0, 5.0, 5.0]
        points = F32(points)
        shapes = U32(shapes)
        hypo = rup.hypocenter.x, rup.hypocenter.y, rup.hypocenter.z
        rec = numpy.zeros(1, rupture_dt)[0]
        rec['seed'] = rup.rup_id
        n = len(points) // 3
        lons = points[0:n]
        lats = points[n:2 * n]
        rec['minlon'] = minlon = lons.min()
        rec['minlat'] = minlat = lats.min()
        rec['maxlon'] = maxlon = lons.max()
        rec['maxlat'] = maxlat = lats.max()
        rec['mag'] = rup.mag
        rec['hypo'] = hypo
        if srcfilter.integration_distance and len(
                srcfilter.close_sids(rec, rup.tectonic_region_type)) == 0:
            continue
        rate = getattr(rup, 'occurrence_rate', numpy.nan)
        tup = (0, ebrupture.rup_id, ebrupture.source_id, ebrupture.trt_smrlz,
               rup.code, ebrupture.n_occ, rup.mag, rup.rake, rate, minlon,
               minlat, maxlon, maxlat, hypo, 0, 0)
        rups.append(tup)
        # we are storing the geometries as arrays of 32 bit floating points;
        # the first element is the number of surfaces, then there are
        # 2 * num_surfaces integers describing the first and second
        # dimension of each surface, and then the lons, lats and deps of
        # the underlying meshes of points.
        geom = numpy.concatenate([[len(shapes) // 2], shapes, points])
        geoms.append(geom)
    if not rups:
        return ()
    dic = dict(geom=numpy.array(geoms, object))
    # NB: PMFs for nonparametric ruptures are not saved since they
    # are useless for the GMF computation
    return hdf5.ArrayWrapper(numpy.array(rups, rupture_dt), dic)
Exemplo n.º 3
0
 def surface_to_array(surface):
     return surface_to_arrays(surface)[0]