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
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])
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])
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