Ejemplo n.º 1
0
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
Ejemplo n.º 2
0
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
Ejemplo n.º 3
0
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
Ejemplo n.º 4
0
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
Ejemplo n.º 5
0
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