Source code for kite.sources.base

import numpy as num

from kite.util import Subject
from pyrocko import orthodrome as od
from pyrocko.guts import Object, Float

d2r = num.pi / 180.
r2d = 180. / num.pi
km = 1e3


[docs]class SandboxSource(Object): lat = Float.T( default=0., help='Latitude in [deg]') lon = Float.T( default=0., help='Longitude in [deg]') easting = Float.T( default=0., help='Easting in [m]') northing = Float.T( default=0., help='Northing in [m]') depth = Float.T( default=1.*km, help='Depth in [m]') def __init__(self, *args, **kwargs): Object.__init__(self, *args, **kwargs) self._cached_result = None self.evParametersChanged = Subject() self._sandbox = None def parametersUpdated(self): self._cached_result = None self.evParametersChanged.notify() def getSandboxOffset(self): if not self._sandbox or (self.lat == 0. and self.lon == 0.): return 0., 0. return od.latlon_to_ne_numpy( self._sandbox.frame.llLat, self._sandbox.frame.llLon, self.lat, self.lon) def getParametersArray(self): raise NotImplementedError
[docs]class SandboxSourceRectangular(SandboxSource): width = Float.T( help='Width, downdip in [m]', default=10000.,) length = Float.T( help='Length in [m]', default=10000.,) strike = Float.T( default=45., help='Strike, clockwise from North in [deg]; -180-180') dip = Float.T( default=45., help='Dip, down from horizontal in [deg]; 0-90') rake = Float.T( default=90., help='Rake, clockwise in [deg]; 0 is right-lateral strike slip') slip = Float.T( default=1.5, help='Slip in [m]', optional=True) def outline(self): coords = num.empty((4, 2)) c_strike = num.cos(self.strike * d2r) s_strike = num.sin(self.strike * d2r) c_dip = num.cos(self.dip * d2r) coords[0, 0] = s_strike * self.length/2 coords[0, 1] = c_strike * self.length/2 coords[1, 0] = -coords[0, 0] coords[1, 1] = -coords[0, 1] coords[2, 0] = coords[1, 0] - c_strike * c_dip * self.width coords[2, 1] = coords[1, 1] + s_strike * c_dip * self.width coords[3, 0] = coords[0, 0] - c_strike * c_dip * self.width coords[3, 1] = coords[0, 1] + s_strike * c_dip * self.width north_shift, east_shift = self.getSandboxOffset() coords[:, 0] += self.easting + east_shift coords[:, 1] += self.northing + north_shift return coords @property def segments(self): yield self @classmethod def fromPyrockoSource(cls, source, store_dir=None, **kwargs): d = dict( lat=source.lat, lon=source.lon, northing=source.north_shift, easting=source.east_shift, depth=source.depth, width=source.width, length=source.length, strike=source.strike, dip=source.dip, rake=source.rake, slip=source.slip) if hasattr(cls, 'decimation_factor'): d['decimation_factor'] = source.decimation_factor if hasattr(cls, 'store_dir'): d['store_dir'] = store_dir return cls(**d)
class ProcessorProfile(dict): pass class SourceProcessor(object): '''Interface definition of the processor ''' __implements__ = 'ProcessorName' # Defines which backend is implemented def __init__(self, sandbox_scene): self._log = sandbox_scene._log.getChild(self.__class__.__name__) def process(sources, coords, nthreads=0): raise NotImplementedError() result = { 'displacement.n': num.array(), 'displacement.e': num.array(), 'displacement.d': num.array(), 'processor_profile': ProcessorProfile() } return result