Ejemplo n.º 1
0
def get_conditional_gmfs(database,
                         rupture,
                         sites,
                         gsims,
                         imts,
                         number_simulations,
                         truncation_level,
                         correlation_model=DEFAULT_CORRELATION):
    """
    Get a set of random fields conditioned on a set of observations
    :param database:
        Ground motion records for the event as instance of :class:
        smtk.sm_database.GroundMotionDatabase
    :param rupture:
        Event rupture as instance of :class:
        openquake.hazardlib.source.rupture.Rupture
    :param sites:
        Target sites as instance of :class:
        openquake.hazardlib.site.SiteCollection
    :param list gsims:
        List of GMPEs required
    :param list imts:
        List of intensity measures required
    :param int number_simulations:
        Number of simulated fields required
    :param float truncation_level:
        Ground motion truncation level
    """

    # Get known sites mesh
    known_sites = database.get_site_collection()

    # Get Observed Residuals
    residuals = Residuals(gsims, imts)
    residuals.get_residuals(database)
    imt_dict = OrderedDict([(imtx,
                             np.zeros([len(sites.lons), number_simulations]))
                            for imtx in imts])
    gmfs = OrderedDict([(gmpe, imt_dict) for gmpe in gsims])
    gmpe_list = [GSIM_LIST[gmpe]() for gmpe in gsims]
    cmaker = ContextMaker(rupture.tectonic_region_type, gmpe_list,
                          dict(imtls={imt: [0]
                                      for imt in imts}))
    ctxs = cmaker.get_ctxs([rupture], sites)
    if len(ctxs) == 1:  # engine version >= 3.13
        rupture = sctx = dctx = ctxs[0]
    else:  # older versions
        _rctx, sctx, dctx = ctxs
    for gsim in gmpe_list:
        gmpe = gsim.__class__.__name__
        for imtx in imts:
            if truncation_level == 0:
                gmfs[gmpe][imtx], _ = gsim.get_mean_and_stddevs(
                    sctx, rupture, dctx, from_string(imtx), stddev_types=[])
                continue
            if "Intra event" in gsim.DEFINED_FOR_STANDARD_DEVIATION_TYPES:
                epsilon = conditional_simulation(
                    known_sites,
                    residuals.residuals[gmpe][imtx]["Intra event"], sites,
                    imtx, number_simulations, correlation_model)
                tau = np.unique(residuals.residuals[gmpe][imtx]["Inter event"])
                mean, [stddev_inter, stddev_intra] = gsim.get_mean_and_stddevs(
                    sctx, rupture, dctx, from_string(imtx),
                    ["Inter event", "Intra event"])
                for iloc in range(0, number_simulations):
                    gmfs[gmpe][imtx][:, iloc] = np.exp(mean +
                                                       (tau * stddev_inter) +
                                                       (epsilon[:, iloc] *
                                                        stddev_intra))
            else:
                epsilon = conditional_simulation(
                    known_sites, residuals.residuals[gmpe][imtx]["Total"],
                    sites, imtx, number_simulations, correlation_model)
                tau = None
                mean, [stddev_total
                       ] = gsim.get_mean_and_stddevs(sctx, rupture, dctx,
                                                     from_string(imtx),
                                                     ["Total"])
                for iloc in range(0, number_simulations):
                    gmfs[gmpe][imtx][:,
                                     iloc] = np.exp(mean + epsilon[:, iloc] *
                                                    stddev_total.flatten())
    return gmfs