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