def grid_point_sources(sources, ps_grid_spacing): """ :param sources: a list of sources with the same grp_id (point sources and not) :param ps_grid_spacing: value of the point source grid spacing in km; if None, do nothing :returns: a dict grp_id -> list of non-point sources and collapsed point sources """ grp_id = sources[0].grp_id for src in sources[1:]: assert src.grp_id == grp_id, (src.grp_id, grp_id) if ps_grid_spacing is None: return {grp_id: sources} out = [src for src in sources if not hasattr(src, 'location')] ps = numpy.array([src for src in sources if hasattr(src, 'location')]) if len(ps) < 2: # nothing to collapse return {grp_id: out + list(ps)} coords = _coords(ps) deltax = angular_distance(ps_grid_spacing, lat=coords[:, 1].mean()) deltay = angular_distance(ps_grid_spacing) grid = groupby_grid(coords[:, 0], coords[:, 1], deltax, deltay) for idxs in grid.values(): cps = CollapsedPointSource(ps[idxs]) cps.num_ruptures = cps.count_ruptures() cps.id = ps[0].id cps.grp_id = ps[0].grp_id cps.et_id = ps[0].et_id cps.nsites = sum(p.nsites for p in ps) out.append(cps) return {sources[0].grp_id: out}
def grid_point_sources(sources, ps_grid_spacing, monitor=Monitor()): """ :param sources: a list of sources with the same grp_id (point sources and not) :param ps_grid_spacing: value of the point source grid spacing in km; if None, do nothing :returns: a dict grp_id -> list of non-point sources and collapsed point sources """ grp_id = sources[0].grp_id for src in sources[1:]: assert src.grp_id == grp_id, (src.grp_id, grp_id) if ps_grid_spacing is None: return {grp_id: sources} out = [src for src in sources if not hasattr(src, 'location')] ps = numpy.array([src for src in sources if hasattr(src, 'location')]) if len(ps) < 2: # nothing to collapse return {grp_id: out + list(ps)} coords = _coords(ps) deltax = angular_distance(ps_grid_spacing, lat=coords[:, 1].mean()) deltay = angular_distance(ps_grid_spacing) grid = groupby_grid(coords[:, 0], coords[:, 1], deltax, deltay) task_no = getattr(monitor, 'task_no', 0) for i, idxs in enumerate(grid.values()): if len(idxs) > 1: cps = CollapsedPointSource('cps-%d-%d' % (task_no, i), ps[idxs]) cps.id = ps[0].id cps.grp_id = ps[0].grp_id cps.trt_smrlz = ps[0].trt_smrlz out.append(cps) else: # there is a single source out.append(ps[idxs[0]]) return {grp_id: out}