# # earthquake_tsunami function # """This function returns a callable object representing an initial water displacement generated by a submarine earthqauke. Using input parameters: Required length along-stike length of rupture area width down-dip width of rupture area strike azimuth (degrees, measured from north) of fault axis dip angle of fault dip in degrees w.r.t. horizontal depth depth to base of rupture area Optional x0 x origin (0) y0 y origin (0) slip metres of fault slip (1) rake angle of slip (w.r.t. horizontal) in fault plane (90 degrees) The returned object is a callable okada function that represents the initial water displacement generated by a submarine earthuake. """ def earthquake_tsunami(length, width, strike, depth, \ dip, x0=0.0, y0=0.0, slip=1.0, rake=90.,\ domain=None, verbose=False): from math import sin, radians if domain is not None: xllcorner = domain.geo_reference.get_xllcorner() yllcorner = domain.geo_reference.get_yllcorner() x0 = x0 - xllcorner # fault origin (relative) y0 = y0 - yllcorner #a few temporary print statements if verbose is True: print '\nThe Earthquake ...' print '\tLength: ', length print '\tDepth: ', depth print '\tStrike: ', strike print '\tWidth: ', width print '\tDip: ', dip print '\tSlip: ', slip print '\tx0: ', x0 print '\ty0: ', y0 # warning test test = width*1000.0*sin(radians(dip)) - depth if verbose is True: if test > 0.0: print 'Earthquake source not located below seafloor' print 'Please check depth' return Okada_func(length=length, width=width, dip=dip, \ x0=x0, y0=y0, strike=strike, depth=depth, \ slip=slip, rake=rake, test=test) # # Okada class # """This is a callable class representing the initial water displacment generated by an earthquake. Using input parameters: Required length along-stike length of rupture area width down-dip width of rupture area strike azimuth (degrees, measured from north) of fault axis dip angle of fault dip in degrees w.r.t. horizontal depth depth to base of rupture area Optional x0 x origin (0) y0 y origin (0) slip metres of fault slip (1) rake angle of slip (w.r.t. horizontal) in fault plane (90 degrees) """ class Okada_func: def __init__(self, length, width, dip, x0, y0, strike, \ depth, slip, rake, test): self.dip = dip self.length = length self.width = width self.x0 = x0 self.y0 = y0 self.strike = strike self.depth = depth self.slip = slip self.rake = rake self.test = test def __call__(self, x, y): """Make Okada_func a callable object. If called as a function, this object returns z values representing the initial 3D distribution of water heights at the points (x,y) produced by a submarine mass failure. """ from math import sin, cos, radians, exp, cosh from Numeric import zeros, Float from okada import okadatest #ensure vectors x and y have the same length N = len(x) assert N == len(y) depth = self.depth dip = self.dip length = self.length width = self.width x0 = self.x0 y0 = self.y0 strike = self.strike dip = self.dip rake = self.rake slip = self.slip #double Gaussian calculation assumes water displacement is oriented #E-W, so, for displacement at some angle alpha clockwise from the E-W #direction, rotate (x,y) coordinates anti-clockwise by alpha cosa = cos(radians(strike)) sina = sin(radians(strike)) xr = ( (x-x0) * sina + (y-y0) * cosa) yr = (-(x-x0) * cosa + (y-y0) * sina) z = okada(xr,yr,depth,length,width,dip,rake,slip) return z