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
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
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
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]
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
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