コード例 #1
0
ファイル: tests__utils_test.py プロジェクト: gvallarelli/NRML
    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]
コード例 #2
0
ファイル: parsers.py プロジェクト: gvallarelli/NRML
    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
コード例 #3
0
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
コード例 #4
0
    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!'
コード例 #5
0
    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)
コード例 #6
0
 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))
コード例 #7
0
ファイル: test_point_source.py プロジェクト: matley/hmtk
    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)
コード例 #8
0
    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