Esempio n. 1
0
 def _expected_char_multi(self):
     tgr_mfd = mfd.TruncatedGRMFD(
         a_val=-3.6, b_val=1.0, min_mag=5.2, max_mag=6.4, bin_width=1.0)
     surfaces = [
         geo.PlanarSurface(
             strike=89.98254582,
             dip=9.696547068,
             top_left=geo.Point(-1, 1, 21),
             top_right=geo.Point(1, 1, 21),
             bottom_left=geo.Point(-1, -1, 59),
             bottom_right=geo.Point(1, -1, 59)
         ),
         geo.PlanarSurface(
             strike=89.98254582,
             dip=15.0987061388,
             top_left=geo.Point(1, 1, 20),
             top_right=geo.Point(3, 1, 20),
             bottom_left=geo.Point(1, -1, 80),
             bottom_right=geo.Point(3, -1, 80))]
     multi_surface = geo.MultiSurface(surfaces)
     char = source.CharacteristicFaultSource(
         source_id="7",
         name="characteristic source, multi surface",
         tectonic_region_type="Volcanic",
         mfd=tgr_mfd,
         surface=multi_surface,
         rake=90.0,
         temporal_occurrence_model=PoissonTOM(50.0))
     char.num_ruptures = char.count_ruptures()
     return char
Esempio n. 2
0
    def convert_surfaces(self, surface_nodes):
        """
        Utility to convert a list of surface nodes into a single hazardlib
        surface. There are three possibilities:

        1. there is a single simpleFaultGeometry node; returns a
           :class:`openquake.hazardlib.geo.simpleFaultSurface` instance
        2. there is a single complexFaultGeometry node; returns a
           :class:`openquake.hazardlib.geo.complexFaultSurface` instance
        3. there is a list of PlanarSurface nodes; returns a
           :class:`openquake.hazardlib.geo.MultiSurface` instance

        :param surface_nodes: surface nodes as just described
        """
        surface_node = surface_nodes[0]
        if surface_node.tag.endswith('simpleFaultGeometry'):
            surface = geo.SimpleFaultSurface.from_fault_data(
                self.geo_line(surface_node), ~surface_node.upperSeismoDepth,
                ~surface_node.lowerSeismoDepth, ~surface_node.dip,
                self.rupture_mesh_spacing)
        elif surface_node.tag.endswith('complexFaultGeometry'):
            surface = geo.ComplexFaultSurface.from_fault_data(
                self.geo_lines(surface_node), self.complex_fault_mesh_spacing)
        elif surface_node.tag.endswith('griddedSurface'):
            with context(self.fname, surface_node):
                coords = split_coords_3d(~surface_node.posList)
            points = [geo.Point(*p) for p in coords]
            surface = geo.GriddedSurface.from_points_list(points)
        else:  # a collection of planar surfaces
            planar_surfaces = list(map(self.geo_planar, surface_nodes))
            surface = geo.MultiSurface(planar_surfaces)
        return surface
Esempio n. 3
0
    def _expected_char_multi(self):
        tgr_mfd = mfd.TruncatedGRMFD(a_val=-3.6,
                                     b_val=1.0,
                                     min_mag=5.2,
                                     max_mag=6.4,
                                     bin_width=1.0)

        surfaces = [
            geo.PlanarSurface(mesh_spacing=self.rupture_mesh_spacing,
                              strike=0.0,
                              dip=90.0,
                              top_left=geo.Point(-1, 1, 21),
                              top_right=geo.Point(1, 1, 21),
                              bottom_left=geo.Point(-1, -1, 59),
                              bottom_right=geo.Point(1, -1, 59)),
            geo.PlanarSurface(mesh_spacing=self.rupture_mesh_spacing,
                              strike=20.0,
                              dip=45.0,
                              top_left=geo.Point(1, 1, 20),
                              top_right=geo.Point(3, 1, 20),
                              bottom_left=geo.Point(1, -1, 80),
                              bottom_right=geo.Point(3, -1, 80))
        ]
        multi_surface = geo.MultiSurface(surfaces)

        char = source.CharacteristicFaultSource(
            source_id="7",
            name="characteristic source, multi surface",
            tectonic_region_type="Volcanic",
            mfd=tgr_mfd,
            surface=multi_surface,
            rake=90.0,
            temporal_occurrence_model=PoissonTOM(50.0),
        )
        return char
Esempio n. 4
0
def charGeom(utype, node, filename):
    surfaces = []
    for geom_node in node.surface:
        if "simpleFaultGeometry" in geom_node.tag:
            _validate_simple_fault_geometry(utype, geom_node, filename)
            trace, usd, lsd, dip, spacing = parse_uncertainty(
                'simpleFaultGeometryAbsolute', geom_node, filename)
            surfaces.append(geo.SimpleFaultSurface.from_fault_data(
                trace, usd, lsd, dip, spacing))
        elif "complexFaultGeometry" in geom_node.tag:
            _validate_complex_fault_geometry(utype, geom_node, filename)
            edges, spacing = parse_uncertainty(
                'complexFaultGeometryAbsolute', geom_node, filename)
            surfaces.append(geo.ComplexFaultSurface.from_fault_data(
                edges, spacing))
        elif "planarSurface" in geom_node.tag:
            _validate_planar_fault_geometry(utype, geom_node, filename)
            nodes = []
            for key in ["topLeft", "topRight", "bottomRight", "bottomLeft"]:
                nodes.append(geo.Point(getattr(geom_node, key)["lon"],
                                       getattr(geom_node, key)["lat"],
                                       getattr(geom_node, key)["depth"]))
            top_left, top_right, bottom_right, bottom_left = tuple(nodes)
            surface = geo.PlanarSurface.from_corner_points(
                top_left, top_right, bottom_right, bottom_left)
            surfaces.append(surface)
        else:
            raise LogicTreeError(
                geom_node, filename, "Surface geometry type not recognised")
    if len(surfaces) > 1:
        return geo.MultiSurface(surfaces)
    else:
        return surfaces[0]
Esempio n. 5
0
    def convert_surfaces(self, surface_nodes):
        """
        Utility to convert a list of surface nodes into a single hazardlib
        surface. There are three possibilities:

        1. there is a single simpleFaultGeometry node; returns a
           :class:`openquake.hazardlib.geo.simpleFaultSurface` instance
        2. there is a single complexFaultGeometry node; returns a
           :class:`openquake.hazardlib.geo.complexFaultSurface` instance
        3. there is a list of PlanarSurface nodes; returns a
           :class:`openquake.hazardlib.geo.MultiSurface` instance

        :param surface_nodes: surface nodes as just described
        """
        surface_node = surface_nodes[0]
        if surface_node.tag == 'simpleFaultGeometry':
            surface = geo.SimpleFaultSurface.from_fault_data(
                self.geo_line(surface_node), ~surface_node.upperSeismoDepth,
                ~surface_node.lowerSeismoDepth, ~surface_node.dip,
                self.rupture_mesh_spacing)
        elif surface_node.tag == 'complexFaultGeometry':
            surface = geo.ComplexFaultSurface.from_fault_data(
                self.geo_lines(surface_node), self.rupture_mesh_spacing)
        else:  # a collection of planar surfaces
            planar_surfaces = map(self.geo_planar, surface_nodes)
            surface = geo.MultiSurface(planar_surfaces)
        return surface
Esempio n. 6
0
def _characteristic_to_hazardlib(src, mesh_spacing, bin_width):
    """
    Convert a NRML characteristic fault source to the HazardLib equivalent.

    The surface of a characteristic fault source can be one of the following:
        * simple fault
        * complex fault
        * one or more planar surfaces

    See :mod:`openquake.nrmllib.models` and :mod:`openquake.hazardlib.source`.

    :param src:
        :class:`openquake.nrmllib.models.CharacteristicSource` instance.
    :param float mesh_spacing:
        Rupture mesh spacing, in km.
    :param float bin_width:
        Truncated Gutenberg-Richter MFD (Magnitude Frequency Distribution) bin
        width.
    :returns:
        The HazardLib representation of the input source.
    """
    mf_dist = _mfd_to_hazardlib(src.mfd, bin_width)

    if isinstance(src.surface, nrml_models.SimpleFaultGeometry):
        shapely_line = wkt.loads(src.surface.wkt)
        fault_trace = geo.Line([geo.Point(*x) for x in shapely_line.coords])

        surface = geo.SimpleFaultSurface.from_fault_data(
            fault_trace, src.surface.upper_seismo_depth,
            src.surface.lower_seismo_depth, src.surface.dip, mesh_spacing)
    elif isinstance(src.surface, nrml_models.ComplexFaultGeometry):
        edges_wkt = []
        edges_wkt.append(src.surface.top_edge_wkt)
        edges_wkt.extend(src.surface.int_edges)
        edges_wkt.append(src.surface.bottom_edge_wkt)

        edges = []

        for edge in edges_wkt:
            shapely_line = wkt.loads(edge)
            line = geo.Line([geo.Point(*x) for x in shapely_line.coords])
            edges.append(line)

        surface = geo.ComplexFaultSurface.from_fault_data(edges, mesh_spacing)
    else:
        # A collection of planar surfaces
        planar_surfaces = []
        for planar_surface in src.surface:
            kwargs = planar_surface.__dict__
            kwargs.update(dict(mesh_spacing=mesh_spacing))

            planar_surfaces.append(geo.PlanarSurface(**kwargs))

        surface = geo.MultiSurface(planar_surfaces)

    char = source.CharacteristicFaultSource(source_id=src.id,
                                            name=src.name,
                                            tectonic_region_type=src.trt,
                                            mfd=mf_dist,
                                            surface=surface,
                                            rake=src.rake)
    return char