Beispiel #1
0
def get_fragility_model(node, fname):
    """
    :param node:
        a vulnerabilityModel node
    :param fname:
        path to the vulnerability file
    :returns:
        a dictionary imt, taxonomy -> fragility function list
    """
    with context(fname, node):
        fid = node['id']
        asset_category = node['assetCategory']
        loss_type = node['lossCategory']
        description = ~node.description
        limit_states = ~node.limitStates
        ffs = node[2:]
    fmodel = scientific.FragilityModel(fid, asset_category, loss_type,
                                       description, limit_states)
    for ff in ffs:
        imt_taxo = ff.imls['imt'], ff['id']
        array, attrs = ffconvert(fname, limit_states, ff)
        ffl = scientific.FragilityFunctionList(array)
        vars(ffl).update(attrs)
        fmodel[imt_taxo] = ffl
    return fmodel
Beispiel #2
0
 def test_discrete(self):
     hazard_imls = [0.05, 0.2, 0.4, 0.6, 0.8, 1, 1.2, 1.4]
     fragility_functions = scientific.FragilityFunctionList(
         [], imls=hazard_imls, format='discrete')
     fragility_functions.extend([
         scientific.FragilityFunctionDiscrete(
             'slight', hazard_imls,
             [0.0, 0.771, 0.95, 0.989, 0.997, 0.999, 1., 1.]),
         scientific.FragilityFunctionDiscrete(
             'moderate', hazard_imls,
             [0, 0.5, 0.861, 0.957, 0.985, 0.994, 0.997, 0.999]),
         scientific.FragilityFunctionDiscrete(
             'extreme', hazard_imls,
             [0.0, 0.231, 0.636, 0.837, 0.924, 0.962, .981, .989]),
         scientific.FragilityFunctionDiscrete(
             'complete', hazard_imls,
             [0, 0.097, 0.414, 0.661, 0.806, 0.887, 0.933, 0.959]),
     ])
     hazard_poes = numpy.array([
         0.999999999997518,
         0.077404949,
         0.015530587,
         0.004201327,
         0.001284191,
         0.000389925,
         0.000127992,
         0.000030350,
     ])
     investigation_time = 50.
     risk_investigation_time = 100.
     poos = scientific.classical_damage(
         fragility_functions, hazard_imls, hazard_poes,
         investigation_time, risk_investigation_time)
     aaae(poos, [1.0415184E-09, 1.4577245E-06, 1.9585762E-03, 6.9677521E-02,
                 9.2836244E-01])
Beispiel #3
0
 def test_continuous(self):
     hazard_imls = numpy.array([
         0.05, 0.1, 0.15, 0.2, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5, 0.55, 0.6,
         0.65, 0.7, 0.75, 0.8, 0.85, 0.9, 0.95, 1, 1.05, 1.1, 1.15, 1.2,
         1.25, 1.3, 1.35, 1.4
     ])
     fragility_functions = scientific.FragilityFunctionList(
         [
             scientific.FragilityFunctionContinuous('slight', 0.160, 0.104),
             scientific.FragilityFunctionContinuous('moderate', 0.225,
                                                    0.158),
             scientific.FragilityFunctionContinuous('extreme', 0.400,
                                                    0.300),
             scientific.FragilityFunctionContinuous('complete', 0.600,
                                                    0.480),
         ],
         imls=hazard_imls,
         steps_per_interval=None)
     hazard_poes = numpy.array([
         0.5917765421,
         0.2482053921,
         0.1298604374,
         0.07718928965,
         0.04912904516,
         0.03262871528,
         0.02226628376,
         0.01553639696,
         0.01101802934,
         0.007905366815,
         0.005741833876,
         0.004199803178,
         0.003088785556,
         0.00229291494,
         0.001716474683,
         0.001284555773,
         0.0009583846496,
         0.0007102377096,
         0.0005201223961,
         0.0003899464723,
         0.0002997724582,
         0.0002287788496,
         0.0001726083994,
         0.0001279544769,
         0.00009229282594,
         0.00006368651249,
         0.00004249201524,
         0.00003033694903,
     ])
     investigation_time = 50.
     risk_investigation_time = 100.
     poos = scientific.classical_damage(fragility_functions, hazard_imls,
                                        hazard_poes, investigation_time,
                                        risk_investigation_time)
     aaae(poos, [0.56652127, 0.12513401, 0.1709355, 0.06555033, 0.07185889])
Beispiel #4
0
def get_fragility_functions(fname,
                            continuous_fragility_discretization,
                            steps_per_interval=None):
    """
    :param fname:
        path of the fragility file
    :param continuous_fragility_discretization:
        continuous_fragility_discretization parameter
    :param steps_per_interval:
        steps_per_interval parameter
    :returns:
        damage_states list and dictionary taxonomy -> functions
    """
    [fmodel] = read_nodes(fname, lambda el: el.tag.endswith('fragilityModel'),
                          nodefactory['fragilityModel'])
    # ~fmodel.description is ignored
    limit_states = ~fmodel.limitStates
    tag = 'ffc' if fmodel['format'] == 'continuous' else 'ffd'
    fragility_functions = AccumDict()  # taxonomy -> functions
    for ffs in fmodel.getnodes('ffs'):
        add_zero_value = False
        # NB: the noDamageLimit is only defined for discrete fragility
        # functions. It is a way to set the starting point of the functions:
        # if noDamageLimit is at the left of each IMLs, it means that the
        # function starts at zero at the given point, so we need to add
        # noDamageLimit to the list of IMLs and zero to the list of poes
        nodamage = ffs.attrib.get('noDamageLimit')
        taxonomy = ~ffs.taxonomy
        imt_str, imls, min_iml, max_iml, imlUnit = ~ffs.IML

        if fmodel['format'] == 'discrete':
            if nodamage is not None and nodamage < imls[0]:
                # discrete fragility
                imls = [nodamage] + imls
                add_zero_value = True
            if steps_per_interval:
                gen_imls = scientific.fine_graining(imls, steps_per_interval)
            else:
                gen_imls = imls
        else:  # continuous:
            if min_iml is None:
                raise InvalidFile('Missing attribute minIML, line %d' %
                                  ffs.IML.lineno)
            elif max_iml is None:
                raise InvalidFile('Missing attribute maxIML, line %d' %
                                  ffs.IML.lineno)
            gen_imls = numpy.linspace(min_iml, max_iml,
                                      continuous_fragility_discretization)
        fragility_functions[taxonomy] = scientific.FragilityFunctionList(
            [],
            imt=imt_str,
            imls=list(gen_imls),
            no_damage_limit=nodamage,
            continuous_fragility_discretization=
            continuous_fragility_discretization,
            steps_per_interval=steps_per_interval)
        lstates = []
        for ff in ffs.getnodes(tag):
            ls = ff['ls']  # limit state
            lstates.append(ls)
            if tag == 'ffc':
                with context(fname, ff):
                    mean_stddev = ~ff.params
                fragility_functions[taxonomy].append(
                    scientific.FragilityFunctionContinuous(ls, *mean_stddev))
            else:  # discrete
                with context(fname, ff):
                    poes = ~ff.poEs
                if add_zero_value:
                    poes = [0.] + poes

                fragility_functions[taxonomy].append(
                    scientific.FragilityFunctionDiscrete(
                        ls, imls, poes, nodamage))

        if lstates != limit_states:
            raise InvalidFile("Expected limit states %s, got %s in %s" %
                              (limit_states, lstates, fname))

    fragility_functions.damage_states = ['no_damage'] + limit_states
    return fragility_functions