def split_sources(srcs): """ :param srcs: sources :returns: a pair (split sources, split time) or just the split_sources """ from openquake.hazardlib.source import splittable sources = [] split_time = {} # src.id -> time for src in srcs: if not splittable(src): sources.append(src) continue t0 = time.time() if not src.num_ruptures: # not set yet src.num_ruptures = src.count_ruptures() mag_a, mag_b = src.get_min_max_mag() min_mag = src.min_mag if mag_b < min_mag: # discard the source completely continue if min_mag: splits = [] for s in src: s.min_mag = min_mag mag_a, mag_b = s.get_min_max_mag() if mag_b < min_mag: continue s.num_ruptures = s.count_ruptures() if s.num_ruptures: splits.append(s) else: splits = list(src) try: split_time[src.id] = time.time() - t0 except AttributeError as exc: # missing .id, should never happen raise AttributeError('%s: %s' % (exc, src.source_id)) sources.extend(splits) has_samples = hasattr(src, 'samples') has_scaling_rate = hasattr(src, 'scaling_rate') grp_id = getattr(src, 'grp_id', 0) # 0 in hazardlib if len(splits) > 1: for i, split in enumerate(splits): split.source_id = '%s:%s' % (src.source_id, i) split.et_id = src.et_id split.grp_id = grp_id split.id = src.id if has_samples: split.samples = src.samples if has_scaling_rate: s.scaling_rate = src.scaling_rate elif splits: # single source [s] = splits s.source_id = src.source_id s.et_id = src.et_id s.grp_id = grp_id s.id = src.id if has_samples: s.samples = src.samples if has_scaling_rate: s.scaling_rate = src.scaling_rate return sources, split_time
def split_sources(srcs): """ :param srcs: sources :returns: a pair (split sources, split time) or just the split_sources """ from openquake.hazardlib.source import splittable sources = [] split_time = {} # src.id -> time for src in srcs: t0 = time.time() mag_a, mag_b = src.get_min_max_mag() min_mag = src.min_mag if mag_b < min_mag: # discard the source completely continue has_serial = hasattr(src, 'serial') if has_serial: src.serial = numpy.arange( src.serial, src.serial + src.num_ruptures) if not splittable(src): sources.append(src) split_time[src.id] = time.time() - t0 continue if min_mag: splits = [] for s in src: s.min_mag = min_mag mag_a, mag_b = s.get_min_max_mag() if mag_b < min_mag: continue s.num_ruptures = s.count_ruptures() if s.num_ruptures: splits.append(s) else: splits = list(src) split_time[src.id] = time.time() - t0 sources.extend(splits) has_samples = hasattr(src, 'samples') if len(splits) > 1: start = 0 for i, split in enumerate(splits): split.source_id = '%s:%s' % (src.source_id, i) split.src_group_id = src.src_group_id split.id = src.id if has_serial: nr = split.num_ruptures split.serial = src.serial[start:start + nr] start += nr if has_samples: split.samples = src.samples elif splits: # single source [s] = splits s.source_id = src.source_id s.src_group_id = src.src_group_id s.id = src.id if has_serial: s.serial = src.serial if has_samples: s.samples = src.samples return sources, split_time
def split_sources(srcs): """ :param srcs: sources :returns: a pair (split sources, split time) or just the split_sources """ from openquake.hazardlib.source import splittable sources = [] split_time = {} # src.id -> time for src in srcs: t0 = time.time() mag_a, mag_b = src.get_min_max_mag() min_mag = src.min_mag if mag_b < min_mag: # discard the source completely continue has_serial = hasattr(src, 'serial') if has_serial: src.serial = numpy.arange( src.serial, src.serial + src.num_ruptures) if not splittable(src): sources.append(src) split_time[src.id] = time.time() - t0 continue if min_mag: splits = [] for s in src: s.min_mag = min_mag mag_a, mag_b = s.get_min_max_mag() if mag_b < min_mag: continue s.num_ruptures = s.count_ruptures() if s.num_ruptures: splits.append(s) else: splits = list(src) split_time[src.id] = time.time() - t0 sources.extend(splits) has_samples = hasattr(src, 'samples') if len(splits) > 1: start = 0 for i, split in enumerate(splits): split.source_id = '%s:%s' % (src.source_id, i) split.src_group_id = src.src_group_id split.id = src.id if has_serial: nr = split.num_ruptures split.serial = src.serial[start:start + nr] start += nr if has_samples: split.samples = src.samples elif splits: # single source splits[0].id = src.id if has_serial: splits[0].serial = src.serial if has_samples: splits[0].samples = src.samples return sources, split_time
def split_sources(srcs, min_mag): """ :param srcs: sources :returns: a pair (split sources, split time) """ from openquake.hazardlib.source import splittable sources = [] split_time = {} # src.id -> time for src in srcs: t0 = time.time() small_mag = min_mag and src.get_min_max_mag()[0] < min_mag if not splittable(src): if not small_mag: sources.append(src) split_time[src.id] = time.time() - t0 continue if small_mag: splits = [] for s in src: if min_mag and s.get_min_max_mag()[0] < min_mag: # discard some ruptures s.min_mag = min_mag s.num_ruptures = s.count_ruptures() if s.num_ruptures: splits.append(s) else: splits.append(s) else: splits = list(src) split_time[src.id] = time.time() - t0 sources.extend(splits) has_serial = hasattr(src, 'serial') has_samples = hasattr(src, 'samples') if len(splits) > 1: start = 0 for i, split in enumerate(splits): split.source_id = '%s:%s' % (src.source_id, i) split.src_group_id = src.src_group_id split.id = src.id if has_serial: nr = split.num_ruptures split.serial = src.serial[start:start + nr] start += nr if has_samples: split.samples = src.samples elif splits: # single source splits[0].id = src.id if has_serial: splits[0].serial = src.serial if has_samples: splits[0].samples = src.samples return sources, split_time
def split_source(src): """ :param src: a splittable (or not splittable) source :returns: the underlying sources (or the source itself) """ from openquake.hazardlib.source import splittable # avoid circular import if not splittable(src): return [src] if not src.num_ruptures: # not set yet src.num_ruptures = src.count_ruptures() mag_a, mag_b = src.get_min_max_mag() min_mag = src.min_mag if mag_b < min_mag: # discard the source completely return [src] if min_mag: splits = [] for s in src: s.min_mag = min_mag mag_a, mag_b = s.get_min_max_mag() if mag_b < min_mag: continue s.num_ruptures = s.count_ruptures() if s.num_ruptures: splits.append(s) else: splits = list(src) has_samples = hasattr(src, 'samples') has_scaling_rate = hasattr(src, 'scaling_rate') grp_id = getattr(src, 'grp_id', 0) # 0 in hazardlib if len(splits) > 1: for i, split in enumerate(splits): split.source_id = '%s:%s' % (src.source_id, i) split.et_id = src.et_id split.grp_id = grp_id split.id = src.id if has_samples: split.samples = src.samples if has_scaling_rate: s.scaling_rate = src.scaling_rate elif splits: # single source [s] = splits s.source_id = src.source_id s.et_id = src.et_id s.grp_id = grp_id s.id = src.id if has_samples: s.samples = src.samples if has_scaling_rate: s.scaling_rate = src.scaling_rate return splits