def _parse_mfd(cls, src_elem): """ :param src_elem: :class:`lxml.etree._Element` instance representing a source. """ [mfd_elem] = _xpath(src_elem, ('.//nrml:truncGutenbergRichterMFD | ' './/nrml:incrementalMFD')) value_set = False if mfd_elem.tag == '{%s}truncGutenbergRichterMFD' % (nrml.NAMESPACE): mfd = models.TGRMFD() for key in TGR_MAP.keys(): key_string = mfd_elem.get(key) if key_string: value_set = True setattr(mfd, TGR_MAP[key], float(key_string)) elif mfd_elem.tag == '{%s}incrementalMFD' % (nrml.NAMESPACE): mfd = models.IncrementalMFD() if mfd_elem.get('minMag'): value_set = True mfd.min_mag = float(mfd_elem.get('minMag')) if mfd_elem.get('binWidth'): value_set = True mfd.bin_width = float(mfd_elem.get('binWidth')) [occur_rates] = _xpath(mfd_elem, './nrml:occurRates') if occur_rates.text: value_set = True mfd.occur_rates = [float(x) for x in occur_rates.text.split()] if value_set: return mfd else: return None
def _parse_mfd(cls, src_elem): """ :param src_elem: :class:`lxml.etree._Element` instance representing a source. """ [mfd_elem] = _xpath(src_elem, ('.//nrml:truncGutenbergRichterMFD | ' './/nrml:incrementalMFD')) if mfd_elem.tag == '{%s}truncGutenbergRichterMFD' % ( openquake.nrmllib.NAMESPACE): mfd = models.TGRMFD() mfd.a_val = float(mfd_elem.get('aValue')) mfd.b_val = float(mfd_elem.get('bValue')) mfd.min_mag = float(mfd_elem.get('minMag')) mfd.max_mag = float(mfd_elem.get('maxMag')) elif mfd_elem.tag == '{%s}incrementalMFD' % ( openquake.nrmllib.NAMESPACE): mfd = models.IncrementalMFD() mfd.min_mag = float(mfd_elem.get('minMag')) mfd.bin_width = float(mfd_elem.get('binWidth')) [occur_rates] = _xpath(mfd_elem, './nrml:occurRates') mfd.occur_rates = [float(x) for x in occur_rates.text.split()] return mfd
def test_area_with_incr_mfd(self): area_mfd = nrml_models.IncrementalMFD(min_mag=6.55, bin_width=0.1, occur_rates=[0.1, 0.2, 0.3, 0.4]) self.area_source_attrib['mfd'] = area_mfd area_source = nrml_models.AreaSource(**self.area_source_attrib) # Re-scaled MFD for the points point_mfd = nrml_models.IncrementalMFD( min_mag=6.55, bin_width=0.1, occur_rates=[0.025, 0.05, 0.075, 0.1]) for exp in self.expected: exp.mfd = point_mfd actual = list( source_input.area_source_to_point_sources(area_source, 100)) equal, err = helpers.deep_eq(self.expected, actual) self.assertTrue(equal, err)
def test_mfd_to_hazardlib_nrmllib_ed(self): """ Tests the conversion to hazardlib fomrulation for the models.IncrementalMFD case """ output = conv.mfd_to_hazardlib(models.IncrementalMFD(4.5, 0.1, [6.5])) self.assertIsInstance(output, mfd.evenly_discretized.EvenlyDiscretizedMFD) self.assertAlmostEqual(output.min_mag, 4.5) self.assertAlmostEqual(output.bin_width, 0.1)
def test_raises_useful_error(self): # Test that the source id and name are included with conversion errors, # to help the users deal with problems in their source models. area_geom = nrml_models.AreaGeometry( wkt='POLYGON((0.0 0.0, 1.0 0.0, 0.0 0.0 ))', upper_seismo_depth=0.0, lower_seismo_depth=10.0, ) area_mfd = nrml_models.IncrementalMFD( min_mag=6.55, bin_width=0.1, occur_rates=[ 0.0010614989, 8.8291627E-4, 7.3437777E-4, 6.108288E-4, 5.080653E-4 ], ) area_npd = [ nrml_models.NodalPlane(probability=decimal.Decimal("0.3"), strike=0.0, dip=90.0, rake=0.0), nrml_models.NodalPlane(probability=decimal.Decimal("0.7"), strike=90.0, dip=45.0, rake=90.0), ] area_hdd = [ nrml_models.HypocentralDepth(probability=decimal.Decimal("0.5"), depth=4.0), nrml_models.HypocentralDepth(probability=decimal.Decimal("0.5"), depth=8.0), ] area_src = nrml_models.AreaSource( id='1', name='Quito', trt='Active Shallow Crust', geometry=area_geom, mag_scale_rel='PeerMSR', rupt_aspect_ratio=1.5, mfd=area_mfd, nodal_plane_dist=area_npd, hypo_depth_dist=area_hdd, ) with self.assertRaises(Exception) as ar: source_input.nrml_to_hazardlib(area_src, MESH_SPACING, BIN_WIDTH, AREA_SRC_DISC) expected_error = ( "The following error has occurred with source id='1', " "name='Quito': Could not create geometry because of errors while " "reading input.") self.assertEqual(expected_error, ar.exception.message)
def area_source_to_point_sources(area_src, area_src_disc): """ Split an area source into a generator of point sources. MFDs will be rescaled appropriately for the number of points in the area mesh. :param area_src: :class:`openquake.nrmllib.models.AreaSource` :param float area_src_disc: Area source discretization step, in kilometers. """ shapely_polygon = wkt.loads(area_src.geometry.wkt) area_polygon = geo.Polygon( # We ignore the last coordinate in the sequence here, since it is a # duplicate of the first. hazardlib will close the loop for us. [geo.Point(*x) for x in list(shapely_polygon.exterior.coords)[:-1]]) mesh = area_polygon.discretize(area_src_disc) num_points = len(mesh) area_mfd = area_src.mfd if isinstance(area_mfd, nrml_models.TGRMFD): new_a_val = math.log10(10**area_mfd.a_val / float(num_points)) new_mfd = nrml_models.TGRMFD(a_val=new_a_val, b_val=area_mfd.b_val, min_mag=area_mfd.min_mag, max_mag=area_mfd.max_mag) elif isinstance(area_mfd, nrml_models.IncrementalMFD): new_occur_rates = [float(x) / num_points for x in area_mfd.occur_rates] new_mfd = nrml_models.IncrementalMFD(min_mag=area_mfd.min_mag, bin_width=area_mfd.bin_width, occur_rates=new_occur_rates) for i, (lon, lat) in enumerate(izip(mesh.lons, mesh.lats)): pt = nrml_models.PointSource( # Generate a new ID and name id='%s-%s' % (area_src.id, i), name='%s-%s' % (area_src.name, i), trt=area_src.trt, geometry=nrml_models.PointGeometry( upper_seismo_depth=area_src.geometry.upper_seismo_depth, lower_seismo_depth=area_src.geometry.lower_seismo_depth, wkt='POINT(%s %s)' % (lon, lat)), mag_scale_rel=area_src.mag_scale_rel, rupt_aspect_ratio=area_src.rupt_aspect_ratio, mfd=new_mfd, nodal_plane_dist=area_src.nodal_plane_dist, hypo_depth_dist=area_src.hypo_depth_dist) yield pt
def convert(self, mag_freq_dist): ''' :param mag_freq_dist: Magnitude frequency distribution as instance of the :class: openquake.hazardlib.mfd.evenly_discretized.EvenlyDiscretized :returns: Evenly discretized magnitude frequency distribution as an instance of the :class: openquake.nrmllib.models.IncrementalMFD ''' assert isinstance(mag_freq_dist, mfd.evenly_discretized.EvenlyDiscretizedMFD) return models.IncrementalMFD( min_mag=mag_freq_dist.min_mag, bin_width=mag_freq_dist.bin_width, occur_rates=mag_freq_dist.occurrence_rates)
r = [l for l in csv.reader(open(filename), delimiter=',', quotechar='"')] #smooth = np.genfromtxt("../data_output/hmtk_bsb2013_decluster_woo_rates.csv", delimiter=",",skip_header=True) for i, line in enumerate(r[1:]): rates = line[5].split(" ") #print rates p = mtkPointSource(identifier = i, name = "%s"%i, trt='Stable Continental Crust', geometry = geo.point.Point(float(line[0]), float(line[1])), upper_depth = 0., lower_depth = 30., mag_scale_rel="WC1994", # default rupt_aspect_ratio=1.0, mfd=models.IncrementalMFD(min_mag=float(line[3]), bin_width=float(line[4]), occur_rates=rates), nodal_plane_dist=None, hypo_depth_dist=None) #print p sources.append(p) s = source_model.mtkSourceModel(identifier="33", name = "PSHAB-Woo Discrete MFD", sources = sources) s.serialise_to_nrml(filename = "../woo/test_source_model_pshab_woo_incremental.xml", use_defaults = True)
def _expected_source_model(cls): # Area: area_geom = models.AreaGeometry( wkt=('POLYGON((-122.5 37.5, -121.5 37.5, -121.5 38.5, -122.5 38.5,' ' -122.5 37.5))'), upper_seismo_depth=0.0, lower_seismo_depth=10.0, ) area_mfd = models.IncrementalMFD( min_mag=6.55, bin_width=0.1, occur_rates=[ 0.0010614989, 8.8291627E-4, 7.3437777E-4, 6.108288E-4, 5.080653E-4 ], ) area_npd = [ models.NodalPlane(probability=decimal.Decimal("0.3"), strike=0.0, dip=90.0, rake=0.0), models.NodalPlane(probability=decimal.Decimal("0.7"), strike=90.0, dip=45.0, rake=90.0), ] area_hdd = [ models.HypocentralDepth(probability=decimal.Decimal("0.5"), depth=4.0), models.HypocentralDepth(probability=decimal.Decimal("0.5"), depth=8.0), ] area_src = models.AreaSource( id='1', name='Quito', trt='Active Shallow Crust', geometry=area_geom, mag_scale_rel='PeerMSR', rupt_aspect_ratio=1.5, mfd=area_mfd, nodal_plane_dist=area_npd, hypo_depth_dist=area_hdd, ) # Point: point_geom = models.PointGeometry( wkt='POINT(-122.0 38.0)', upper_seismo_depth=0.0, lower_seismo_depth=10.0, ) point_mfd = models.TGRMFD( a_val=-3.5, b_val=1.0, min_mag=5.0, max_mag=6.5, ) point_npd = [ models.NodalPlane(probability=decimal.Decimal("0.3"), strike=0.0, dip=90.0, rake=0.0), models.NodalPlane(probability=decimal.Decimal("0.7"), strike=90.0, dip=45.0, rake=90.0), ] point_hdd = [ models.HypocentralDepth(probability=decimal.Decimal("0.5"), depth=4.0), models.HypocentralDepth(probability=decimal.Decimal("0.5"), depth=8.0), ] point_src = models.PointSource( id='2', name='point', trt='Stable Continental Crust', geometry=point_geom, mag_scale_rel='WC1994', rupt_aspect_ratio=0.5, mfd=point_mfd, nodal_plane_dist=point_npd, hypo_depth_dist=point_hdd, ) # Simple: simple_geom = models.SimpleFaultGeometry( wkt='LINESTRING(-121.82290 37.73010, -122.03880 37.87710)', dip=45.0, upper_seismo_depth=10.0, lower_seismo_depth=20.0, ) simple_mfd = models.IncrementalMFD( min_mag=5.0, bin_width=0.1, occur_rates=[ 0.0010614989, 8.8291627E-4, 7.3437777E-4, 6.108288E-4, 5.080653E-4 ], ) simple_src = models.SimpleFaultSource( id='3', name='Mount Diablo Thrust', trt='Active Shallow Crust', geometry=simple_geom, mag_scale_rel='WC1994', rupt_aspect_ratio=1.5, mfd=simple_mfd, rake=30.0, ) # Complex: complex_geom = models.ComplexFaultGeometry( top_edge_wkt=('LINESTRING(-124.704 40.363 0.5493260E+01, ' '-124.977 41.214 0.4988560E+01, ' '-125.140 42.096 0.4897340E+01)'), bottom_edge_wkt=('LINESTRING(-123.829 40.347 0.2038490E+02, ' '-124.137 41.218 0.1741390E+02, ' '-124.252 42.115 0.1752740E+02)'), int_edges=[ ('LINESTRING(-124.704 40.363 0.5593260E+01, ' '-124.977 41.214 0.5088560E+01, ' '-125.140 42.096 0.4997340E+01)'), ('LINESTRING(-124.704 40.363 0.5693260E+01, ' '-124.977 41.214 0.5188560E+01, ' '-125.140 42.096 0.5097340E+01)'), ]) complex_mfd = models.TGRMFD(a_val=-3.5, b_val=1.0, min_mag=5.0, max_mag=6.5) complex_src = models.ComplexFaultSource( id='4', name='Cascadia Megathrust', trt='Subduction Interface', geometry=complex_geom, mag_scale_rel='WC1994', rupt_aspect_ratio=2.0, mfd=complex_mfd, rake=30.0, ) # 3 Characteristic Sources: char_src_simple = models.CharacteristicSource( id='5', name='characteristic source, simple fault', trt='Volcanic', mfd=models.TGRMFD(a_val=-3.5, b_val=1.0, min_mag=5.0, max_mag=6.5), rake=30.0, surface=simple_geom) char_src_complex = models.CharacteristicSource( id='6', name='characteristic source, complex fault', trt='Volcanic', mfd=models.IncrementalMFD( min_mag=5.0, bin_width=0.1, occur_rates=[ 0.0010614989, 8.8291627E-4, 7.3437777E-4, 6.108288E-4, 5.080653E-4 ], ), rake=60.0, surface=complex_geom) char_src_multi = models.CharacteristicSource( id='7', name='characteristic source, multi surface', trt='Volcanic', mfd=models.TGRMFD(a_val=-3.6, b_val=1.0, min_mag=5.2, max_mag=6.4), rake=90.0) psurface_1 = models.PlanarSurface( strike=0.0, dip=90.0, top_left=models.Point(longitude=-1.0, latitude=1.0, depth=21.0), top_right=models.Point(longitude=1.0, latitude=1.0, depth=21.0), bottom_left=models.Point(longitude=-1.0, latitude=-1.0, depth=59.0), bottom_right=models.Point(longitude=1.0, latitude=-1.0, depth=59.0), ) psurface_2 = models.PlanarSurface( strike=20.0, dip=45.0, top_left=models.Point(longitude=1.0, latitude=1.0, depth=20.0), top_right=models.Point(longitude=3.0, latitude=1.0, depth=20.0), bottom_left=models.Point(longitude=1.0, latitude=-1.0, depth=80.0), bottom_right=models.Point(longitude=3.0, latitude=-1.0, depth=80.0), ) char_src_multi.surface = [psurface_1, psurface_2] source_model = models.SourceModel() source_model.name = 'Some Source Model' # Generator: source_model.sources = (x for x in [ area_src, point_src, simple_src, complex_src, char_src_simple, char_src_complex, char_src_multi ]) return source_model