def setUp(self): self.s1 = models.SourceModel(name='s1') self.a1 = models.AreaSource( name='a1', geometry=models.AreaGeometry(wkt=self.POLY)) self.p1 = models.PointSource( name='p1', geometry=models.PointGeometry(wkt=self.POINT)) self.s1.sources = [self.a1, self.p1] self.s2 = models.SourceModel(name='s1') self.a2 = models.AreaSource( name='a1', geometry=models.AreaGeometry(wkt=self.POLY)) self.p2 = models.PointSource( name='p1', geometry=models.PointGeometry(wkt=self.POINT)) self.s2.sources = [self.a2, self.p2]
def _parse_point(cls, src_elem): """ :param src_elem: :class:`lxml.etree._Element` instance representing a source. :returns: Fully populated :class:`openquake.nrmllib.models.PointSource` object. """ point = models.PointSource() cls._set_common_attrs(point, src_elem) point_geom = models.PointGeometry() point.geometry = point_geom [gml_pos] = _xpath(src_elem, './/gml:pos') coords = gml_pos.text.split() point_geom.wkt = 'POINT(%s)' % ' '.join(coords) point_geom.upper_seismo_depth = float( _xpath(src_elem, './/nrml:upperSeismoDepth')[0].text) point_geom.lower_seismo_depth = float( _xpath(src_elem, './/nrml:lowerSeismoDepth')[0].text) point.mfd = cls._parse_mfd(src_elem) point.nodal_plane_dist = cls._parse_nodal_plane_dist(src_elem) point.hypo_depth_dist = cls._parse_hypo_depth_dist(src_elem) return point
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 write_to_nrml(self, output_filename, mmin, upper_depth=0., lower_depth=50., source_model_name="POINT SOURCE MODEL", trt=DEFAULT_TRT, msr=DEFAULT_MSR, aspect=ASPECT_RATIO, hdd=None): """ Converts the smoothed seismicity data to a set of oq-nrml point sources and writes to the output file """ writer = SourceModelXMLWriter(output_filename) source_model = models.SourceModel(source_model_name) source_model.sources = [] print 'Building source model ...' for iloc, row in enumerate(self.data): # Geometry #trt =(row[18]) geom = models.PointGeometry( "POINT (%9.4f %9.4f)" % (row[0], row[1]), upper_depth, lower_depth) if hdd: src_hdd = [] #each tuple with probality and depth for d in hdd: src_hdd.append(models.HypocentralDepth(d[1], d[0])) else: src_hdd = [models.HypocentralDepth(Decimal("1.0"), row[2])] npd = [models.NodalPlane(1, 0, 90, 0)] #if row[5]==1: # npd = [models.NodalPlane(row[6], row[7], row[9], row[8])] #elif row[5] ==2: # npd = [models.NodalPlane(row[6], row[7], row[9], row[8]), models.NodalPlane(row[10], row[11], row[13], row[12])] #else: # npd = [models.NodalPlane(row[6], row[7], row[9], row[8]), models.NodalPlane(row[10], row[11], row[13], row[12]), models.NodalPlane(row[14], row[15], row[17], row[16])] source_model.sources.append( models.PointSource(str(iloc), "PNT_%s" % str(iloc), trt, geom, msr, aspect, self.get_mfd(iloc, row, mmin), npd, src_hdd)) print 'done!' print 'Writing to file ...' writer.serialize(source_model) print 'done!'
def setUp(self): self.area_source_attrib = dict( id='1', name='source A', trt='Active Shallow Crust', geometry=nrml_models.AreaGeometry( upper_seismo_depth=10, lower_seismo_depth=20, wkt=('POLYGON((1.0 1.0, 1.0 -1.0, -1.0 -1.0, -1.0 1.0, ' '1.0 1.0))'), ), mag_scale_rel='WC1994', rupt_aspect_ratio=1.0, mfd=None, nodal_plane_dist=[ nrml_models.NodalPlane(probability=1.0, strike=0.0, dip=90.0, rake=0.0) ], hypo_depth_dist=[ nrml_models.HypocentralDepth(probability=1.0, depth=10.0) ], ) self.expected = [] lons = [ -0.100677001712, 0.798645996576, -0.100591068089, 0.798817863822 ] lats = [ 0.100830691185, 0.100830691185, -0.798490914733, -0.798490914733 ] for i, (lon, lat) in enumerate(zip(lons, lats)): point_attrib = self.area_source_attrib.copy() del point_attrib['geometry'] point_attrib['id'] = '1-%s' % i point_attrib['name'] = 'source A-%s' % i pt_source = nrml_models.PointSource(**point_attrib) pt_source.geometry = nrml_models.PointGeometry( upper_seismo_depth=10, lower_seismo_depth=20, wkt='POINT(%s %s)' % (lon, lat), ) self.expected.append(pt_source)
def create_oqnrml_source(self, use_defaults=False): ''' Converts the source model into an instance of the :class: openquake.nrmllib.models.PointSource :param bool use_defaults: If set to true, will use put in default values for magitude scaling relation, rupture aspect ratio, nodal plane distribution or hypocentral depth distribution where missing. If set to False then value errors will be raised when information is missing. ''' point_geometry = models.PointGeometry(self.geometry.wkt2d, self.upper_depth, self.lower_depth) return models.PointSource( self.id, self.name, self.trt, point_geometry, conv.render_mag_scale_rel(self.mag_scale_rel, use_defaults), conv.render_aspect_ratio(self.rupt_aspect_ratio, use_defaults), conv.render_mfd(self.mfd), conv.render_npd(self.nodal_plane_dist, use_defaults), conv.render_hdd(self.hypo_depth_dist, use_defaults))
def test_create_oqnmrl_point_source(self): ''' Tests the conversion of a point source to an instance of the :class: oqnrmllib.models.PointSource ''' # Define a complete source self.point_source = mtkPointSource('001', 'A Point Source', trt='Active Shallow Crust', geometry=Point(10., 10.), upper_depth=0., lower_depth=20., mag_scale_rel=None, rupt_aspect_ratio=1.0, mfd=models.TGRMFD(a_val=3., b_val=1.0, min_mag=5.0, max_mag=8.0), nodal_plane_dist=None, hypo_depth_dist=None) expected_source = models.PointSource('001', 'A Point Source', geometry=models.PointGeometry( 'POINT(10.0 10.0)', 0., 20.), mag_scale_rel='WC1994', rupt_aspect_ratio=1.0, mfd=models.TGRMFD(a_val=3., b_val=1.0, min_mag=5.0, max_mag=8.0), nodal_plane_dist=None, hypo_depth_dist=None) test_source = self.point_source.create_oqnrml_source(use_defaults=True) self.assertTrue(isinstance(test_source, models.PointSource)) self.assertEqual(test_source.id, expected_source.id) self.assertEqual(test_source.name, expected_source.name) self.assertDictEqual(test_source.geometry.__dict__, expected_source.geometry.__dict__) self.assertAlmostEqual(test_source.mfd.b_val, expected_source.mfd.b_val)
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