Пример #1
0
def scenario_damage(job_id, risk_model, getters, outputdict, params):
    """
    Celery task for the scenario damage risk calculator.

    :param int job_id:
      ID of the currently running job
    :param risk_model:
      A :class:`openquake.risklib.workflows.RiskModel` instance
    :param getters:
      A list of callable hazard getters
    :param outputdict:
      An instance of :class:`..writers.OutputDict` containing
      output container instances (in this case only `LossMap`)
    :param params:
      An instance of :class:`..base.CalcParams` used to compute
      derived outputs
   :returns:
      A matrix of fractions and a taxonomy string
    """
    monitor = EnginePerformanceMonitor(
        None, job_id, scenario_damage, tracing=True)
    # in scenario damage calculation the only loss_type is 'damage'
    [getter] = getters
    [ffs] = risk_model.vulnerability_functions

    # and NO containes
    assert len(outputdict) == 0
    with db.transaction.commit_on_success(using='job_init'):

        with monitor.copy('getting hazard'):
            ground_motion_values = getter.get_data(ffs.imt)

        with monitor.copy('computing risk'):
            fractions = risk_model.workflow(ground_motion_values)
            aggfractions = sum(fractions[i] * asset.number_of_units
                               for i, asset in enumerate(getter.assets))

        with monitor.copy('saving damage per assets'):
            writers.damage_distribution(
                getter.assets, fractions, params.damage_state_ids)

        return aggfractions, risk_model.taxonomy
Пример #2
0
def event_based_fr(job_id, sites, rc, risk_models,
                   getter_builders, outputdict, params):
    """
    :param int job_id:
        ID of the currently running job
    :param rc:
        a :class:`openquake.engine.db.models.RiskCalculation` instance
    :param risk_models:
        a list of RiskModel instances corresponding to the taxonomy
    :param getter_builders:
        a list of GetterBuilder instances associated to the risk models
    :param outputdict:
        an instance of :class:`..writers.OutputDict` containing
        output container instances (e.g. a LossCurve)
    :param params:
        an instance of :class:`..base.CalcParams` used to compute
        derived outputs
    """
    hc = rc.hazard_calculation
    site_ids = set(sites.complete.sids)
    truncation_level = hc.truncation_level
    sorted_imts = sorted(map(from_string, hc.intensity_measure_types))

    # init the Epsilon Provider only once
    for builder in getter_builders:
        builder.init_epsilon_provider(asset_correlation=0)

    # TODO: the following monitors should be replaced by LightMonitors,
    # since they write a lot on the database, once per asset
    getdata_mon = EnginePerformanceMonitor(
        'getting hazard', job_id, event_based_fr)
    getters_mon = getdata_mon.copy('building getters')

    assocs = models.AssocLtRlzTrtModel.objects.filter(
        trt_model__lt_model__hazard_calculation=hc).order_by('rlz')

    # mapping realization -> [(trt_model, gsim)]
    rlz2gsims = {
        rlz: [(a.trt_model, GSIM[a.gsim]()) for a in group]
        for rlz, group in itertools.groupby(
            assocs, operator.attrgetter('rlz'))}

    # building the getters, i.e. initialize .gmv_dict and .hid
    with getters_mon:
        for builder in getter_builders:
            builder.init_getters(sorted_imts, rlz2gsims)

    for builder in getter_builders:
        for getter in builder.getters:
            for gsim, trt_model in zip(getter.gsims, getter.trt_models):
                # read the ruptures from the db
                with getdata_mon.copy('reading ruptures'):
                    ses_ruptures = models.SESRupture.objects.filter(
                        rupture__trt_model=trt_model)

                with getdata_mon.copy('generating gmf'):
                    # NB: the ruptures are already ordered by tag
                    # and therefore by '.rupture'
                    for rupture, group in itertools.groupby(
                            ses_ruptures, operator.attrgetter('rupture')):
                        if rupture.site_indices is None:
                            r_sites = sites
                        else:
                            r_sites = FilteredSiteCollection(
                                rupture.site_indices, sites.complete)
                            if not site_ids.intersection(r_sites.sids):
                                continue  # skip ruptures not contributing

                        # populating the gmv_dicts for each getter
                        getter.build_data(
                            rupture, r_sites, [(r.id, r.seed) for r in group],
                            truncation_level)

        # computing risk
        elt = {}  # event loss table
        with db.transaction.commit_on_success(using='job_init'):
            for risk_model, builder in zip(risk_models, getter_builders):
                elt.update(
                    core.do_event_based(
                        risk_model, builder.getters,
                        outputdict, params, getdata_mon))
    return elt