New class M0Mw for calculating seismic moment and moment magnitude.
This commit is contained in:
		
							parent
							
								
									9f93c25aa8
								
							
						
					
					
						commit
						23b9fda5e4
					
				| @ -6,7 +6,6 @@ Created August/September 2015. | ||||
| :author: Ludger Küperkoch / MAGS2 EP3 working group | ||||
| """ | ||||
| 
 | ||||
| import pdb | ||||
| import matplotlib.pyplot as plt | ||||
| import numpy as np | ||||
| from obspy.core import Stream | ||||
| @ -19,7 +18,7 @@ class Magnitude(object): | ||||
|     amplitudes, local magnitudes and moment magnitudes. | ||||
|     ''' | ||||
| 
 | ||||
|     def __init__(self, wfstream, To, pwin, iplot): | ||||
|     def __init__(self, wfstream, To, pwin, iplot, w0=None, delta=None, rho=None, vp=None): | ||||
|         ''' | ||||
|         :param: wfstream | ||||
|         :type: `~obspy.core.stream.Stream | ||||
| @ -43,8 +42,13 @@ class Magnitude(object): | ||||
|         self.setTo(To) | ||||
|         self.setpwin(pwin) | ||||
|         self.setiplot(iplot) | ||||
|         self.setw0(w0) | ||||
|         self.setrho(rho) | ||||
|         self.setdelta(delta) | ||||
|         self.setvp(vp) | ||||
|         self.calcwapp() | ||||
|         self.calcsourcespec() | ||||
|         self.calcMoMw() | ||||
| 
 | ||||
| 
 | ||||
|     def getwfstream(self): | ||||
| @ -71,6 +75,30 @@ class Magnitude(object): | ||||
|     def setiplot(self, iplot): | ||||
|         self.iplot = iplot | ||||
| 
 | ||||
|     def setw0(self, w0): | ||||
|         self.w0 = w0 | ||||
| 
 | ||||
|     def getw0(self): | ||||
|         return self.w0 | ||||
| 
 | ||||
|     def setrho(self, rho): | ||||
|         self.rho = rho | ||||
| 
 | ||||
|     def getrho(self): | ||||
|         return self.rho | ||||
|   | ||||
|     def setvp(self, vp): | ||||
|         self.vp = vp | ||||
| 
 | ||||
|     def getvp(self): | ||||
|         return self.vp | ||||
| 
 | ||||
|     def setdelta(self, delta): | ||||
|         self.delta = delta | ||||
| 
 | ||||
|     def getdelta(self): | ||||
|         return self.delta | ||||
| 
 | ||||
|     def getwapp(self): | ||||
|         return self.wapp | ||||
| 
 | ||||
| @ -80,12 +108,22 @@ class Magnitude(object): | ||||
|     def getfc(self): | ||||
|         return self.fc | ||||
| 
 | ||||
|     def getMo(self): | ||||
|         return self.Mo | ||||
| 
 | ||||
|     def getMw(self): | ||||
|         return self.Mw | ||||
| 
 | ||||
|     def calcwapp(self): | ||||
|         self.wapp = None | ||||
| 
 | ||||
|     def calcsourcespec(self): | ||||
|         self.sourcespek = None | ||||
| 
 | ||||
|     def calcMoMw(self): | ||||
|         self.Mo = None | ||||
|         self.Mw = None | ||||
| 
 | ||||
| class WApp(Magnitude): | ||||
|     ''' | ||||
|     Method to derive peak-to-peak amplitude as seen on a Wood-Anderson- | ||||
| @ -136,6 +174,32 @@ class WApp(Magnitude): | ||||
|             plt.close(f) | ||||
| 
 | ||||
| 
 | ||||
| class M0Mw(Magnitude): | ||||
|     ''' | ||||
|     Method to calculate seismic moment Mo and moment magnitude Mw. | ||||
|     Uses class w0fc for calculating plateau wo and corner frequency  | ||||
|     fc of source spectrum, respectively. | ||||
|     ''' | ||||
| 
 | ||||
|     def calcMoMw(self): | ||||
| 
 | ||||
|         stream = self.getwfstream() | ||||
|         tr = stream[0] | ||||
| 
 | ||||
|         print("Calculating seismic moment Mo and moment magnitude Mw for station %s ..." \ | ||||
|                % tr.stats.station) | ||||
| 
 | ||||
|         # additional common parameters for calculating Mo | ||||
|         rP = 0.52      # average radiation pattern of P waves (Aki & Richards, 1980) | ||||
|         freesurf = 2.0 # free surface correction, assuming vertical incidence  | ||||
| 
 | ||||
|         self.Mo = (self.getw0() * 4 * np.pi * self.getrho() * np.power(self.getvp(), 3) * \ | ||||
|                   self.getdelta()) / (rP * freesurf)  | ||||
| 
 | ||||
|         self.Mw = 2/3 * np.log10(self.Mo) - 6 | ||||
|         print("MoMw: Calculated seismic moment Mo = %e Nm => Mw = %3.1f " % (self.Mo, self.Mw)) | ||||
| 
 | ||||
|          | ||||
| class w0fc(Magnitude): | ||||
|     ''' | ||||
|     Method to calculate the source spectrum and to derive from that the plateau | ||||
| @ -191,6 +255,14 @@ class w0fc(Magnitude): | ||||
|         print ("w0fc: Determined w0-value: %e m/Hz, \n" | ||||
|                "Determined corner frequency: %f Hz" % (w01, fc1)) | ||||
|          | ||||
|         # use of conventional fitting  | ||||
|         [w02, fc2] = fitSourceModel(F, YY.real, Fcin, self.getiplot()) | ||||
|   | ||||
|         # get w0 and fc as median  | ||||
|         self.w0 = np.median([w01, w02]) | ||||
|         self.fc = np.median([fc1, fc2]) | ||||
|         print("w0fc: Using w0-value = %e m/Hz and fc = %f Hz" % (self.w0, self.fc)) | ||||
| 
 | ||||
| 	if self.getiplot() > 1: | ||||
|             f1 = plt.figure() | ||||
|             plt.subplot(2,1,1) | ||||
| @ -215,13 +287,6 @@ class w0fc(Magnitude): | ||||
|             raw_input() | ||||
|             plt.close(f1) | ||||
| 
 | ||||
|         # use of conventional fitting  | ||||
|         [w02, fc2] = fitSourceModel(F, YY.real, Fcin, self.getiplot()) | ||||
|   | ||||
|         # get w0 and fc as median  | ||||
|         self.w0 = np.median([w01, w02]) | ||||
|         self.fc = np.median([fc1, fc2]) | ||||
|         print("w0fc: Using w0-value = %e m/Hz and fc = %f Hz" % (self.w0, self.fc)) | ||||
| 
 | ||||
| 
 | ||||
| def synthsourcespec(f, omega0, fcorner): | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user