def test_is_writeable(self): parser = SourceModelParser(SourceConverter(50., 1., 10, 0.1, 10.)) groups = map(copy.deepcopy, parser.parse_groups(ALT_MFDS)) # there are a SimpleFaultSource and a CharacteristicFaultSource fd, fname = tempfile.mkstemp(suffix='.xml') with os.fdopen(fd, 'wb'): write_source_model(fname, groups, 'Test Source Model')
def test_is_writeable(self): parser = SourceModelParser(SourceConverter(50., 1., 10, 0.1, 10.)) [sf, cf] = map(copy.deepcopy, parser.parse_sources(ALT_MFDS)) # there are a SimpleFaultSource and a CharacteristicFaultSource fd, fname = tempfile.mkstemp(suffix='.xml') with os.fdopen(fd, 'w'): write_source_model(fname, [sf, cf], 'Test Source Model')
def check_round_trip(self, fname): parser = SourceModelParser(SourceConverter(50., 1., 10, 0.1, 10.)) groups = parser.parse_src_groups(fname) fd, name = tempfile.mkstemp(suffix='.xml') with os.fdopen(fd, 'wb'): write_source_model(name, groups, 'Test Source Model') if open(name).read() != open(fname).read(): raise Exception('Different files: %s %s' % (name, fname)) os.remove(name)
def check_round_trip(self, fname): parser = SourceModelParser(SourceConverter(50., 1., 10, 0.1, 10.)) sources = parser.parse_sources(fname) fd, name = tempfile.mkstemp(suffix='.xml') with os.fdopen(fd, 'w'): write_source_model(name, sources, 'Test Source Model') if open(name).read() != open(fname).read(): raise Exception('Different files: %s %s' % (name, fname)) os.remove(name)
def check_round_trip(self, fname): sources = [] for trt_model in get_source_model(fname): sources.extend(trt_model.sources) fd, name = tempfile.mkstemp(suffix='.xml') with os.fdopen(fd, 'w'): write_source_model(name, sources, 'Test Source Model') if open(name).read() != open(fname).read(): raise Exception('Different files: %s %s' % (name, fname)) os.remove(name)
def area2pt_source(area_source_file, discretisation=200.): """Calls OpenQuake parsers to read area source model from source_mode.xml type file, convert to point sources and write to a new nrml source model file. :params area_source_file: nrml format file of the area source :params discretisation: Grid size (km) for the area source discretisation, which defines the distance between resulting point sources. """ converter = SourceConverter(50, 10, width_of_mfd_bin=0.1, area_source_discretization=discretisation) parser = SourceModelParser(converter) print[method for method in dir(parser)] # if callable(getattr(parser, method))] try: sources = parser.parse_sources(area_source_file) except AttributeError: # Handle version 2.1 and above sources = [] groups = parser.parse_src_groups(area_source_file) for group in groups: for source in group: sources.append(source) name = 'test_point_model' new_pt_sources = {} for source in sources: pt_sources = area_to_point_sources(source) for pt in pt_sources: pt.source_id = pt.source_id.replace(':', '') pt.name = pt.name.replace(':', '_') try: new_pt_sources[pt.tectonic_region_type].append(pt) except KeyError: new_pt_sources[pt.tectonic_region_type] = [pt] # print [method for method in dir(pt) if callable(getattr(pt, method))] # print [attribute for attribute in dir(pt)] nrml_pt_file = area_source_file[:-4] + '_pts.xml' source_group_list = [] id = 0 for trt, sources in new_pt_sources.iteritems(): source_group = SourceGroup(trt, sources=sources, id=id) id += 1 source_group_list.append(source_group) write_source_model(nrml_pt_file, source_group_list, name='Leonard2008')
def serialise_to_nrml(self, filename, use_defaults=False): ''' Writes the source model to a nrml source model file given by the filename :param str filename: Path to output file :param bool use_defaults: Boolean to indicate whether to use default values (True) or not. If set to False, ValueErrors will be raised when an essential attribute is missing. ''' source_model = self.convert_to_oqhazardlib(PoissonTOM(1.0), 2.0, # Default values 2.0, 10.0, use_defaults=use_defaults) write_source_model(filename, source_model, name=self.name)
def serialise_to_nrml(self, filename, use_defaults=False): ''' Writes the source model to a nrml source model file given by the filename :param str filename: Path to output file :param bool use_defaults: Boolean to indicate whether to use default values (True) or not. If set to False, ValueErrors will be raised when an essential attribute is missing. ''' source_model = self.convert_to_oqhazardlib( PoissonTOM(1.0), 2.0, # Default values 2.0, 10.0, use_defaults=use_defaults) write_source_model(filename, source_model, name=self.name)
def pt2fault_distance(pt_sources, fault_sources, min_distance = 5, filename = 'source_model.xml', buffer_distance = 5.): """Calculate distances from a pt source rupture plane to the fault sources to then reduce Mmax on events that are within a certain distance :param pt_sources: list of PointSource objects :param fault_sources: List of FaultSource objects :param min_distance: Minimum distance (km) within which we want a point source rupture to be from a fault. :param filename: Name of output nrml file for revised pt source model :param buffer_distance: Degrees, initial filter to only process pts within this distance from the fault """ # Extract the points of the fault source mesh fault_lons = [] fault_lats = [] fault_depths = [] for fault in fault_sources: whole_fault_surface = SimpleFaultSurface.from_fault_data( fault.fault_trace, fault.upper_seismogenic_depth, fault.lower_seismogenic_depth, fault.dip, fault.rupture_mesh_spacing) fault_lons.append(whole_fault_surface.mesh.lons.flatten()) fault_lats.append(whole_fault_surface.mesh.lats.flatten()) fault_depths.append(whole_fault_surface.mesh.depths.flatten()) fault_lons = np.concatenate(fault_lons) fault_lats = np.concatenate(fault_lats) fault_depths = np.concatenate(fault_depths) min_fault_lon = np.min(fault_lons) max_fault_lon = np.max(fault_lons) min_fault_lat = np.min(fault_lats) max_fault_lat = np.max(fault_lats) # Generate ruptures for point sources minimum_distance_list = [] revised_point_sources = {'Cratonic': [], 'Non_cratonic': []} for pt in pt_sources: # For speeding things up if pt.location.longitude < min_fault_lon - buffer_distance or \ pt.location.longitude > max_fault_lon + buffer_distance or \ pt.location.latitude < min_fault_lat - buffer_distance or \ pt.location.latitude > max_fault_lat + buffer_distance: continue rupture_mags = [] rupture_lons = [] rupture_lats = [] rupture_depths = [] ruptures = pt.iter_ruptures() for rupture in ruptures: rupture_mags.append(rupture.mag) rupture_lons.append(rupture.surface.corner_lons) rupture_lats.append(rupture.surface.corner_lats) rupture_depths.append(rupture.surface.corner_depths) rupture_mags = np.array(rupture_mags).flatten() # make the same length as the corners rupture_mags = np.repeat(rupture_mags, 4) rupture_lons = np.array(rupture_lons).flatten() rupture_lats = np.array(rupture_lats).flatten() rupture_depths = np.array(rupture_depths).flatten() lons1,lons2 = np.meshgrid(fault_lons, rupture_lons) lats1,lats2 = np.meshgrid(fault_lats, rupture_lats) depths1, depths2 = np.meshgrid(fault_depths, rupture_depths) # Calculate distance from pt to all fault distances = distance(lons1, lats1, depths1, lons2, lats2, depths2) closest_distance_to_faults = np.min(distances) print 'Shortest pt to fault distance is', closest_distance_to_faults minimum_distance_list.append(closest_distance_to_faults) # Find where the distance is less than the threshold min_distance too_close_lons = lons2[np.where(distances < min_distance)] too_close_lats = lats2[np.where(distances < min_distance)] if too_close_lons.size > 0: lon_indices = np.where(np.in1d(rupture_lons, too_close_lons))[0] lat_indices = np.where(np.in1d(rupture_lats, too_close_lats))[0] too_close_mags = rupture_mags[np.intersect1d( lon_indices, lat_indices)] print 'Magnitudes of rupture close to fault', too_close_mags minimum_magnitude_intersecting_fault = min(too_close_mags) if minimum_magnitude_intersecting_fault >= \ (pt.mfd.min_mag + pt.mfd.bin_width): pt.mfd.max_mag = minimum_magnitude_intersecting_fault - \ pt.mfd.bin_width revised_point_sources[pt.tectonic_region_type].append(pt) else: revised_point_sources[pt.tectonic_region_type].append(pt) print 'Overall minimum distance (km):', min(minimum_distance_list) source_group_list = [] id = 0 source_model_file = filename print 'Writing to source model file %s' % source_model_file for trt, sources in revised_point_sources.iteritems(): source_group = SourceGroup(trt, sources = sources, id=id) id +=1 source_group_list.append(source_group) write_source_model(source_model_file, source_group_list, name = 'Leonard2008')