New class M0Mw for calculating seismic moment and moment magnitude.

This commit is contained in:
Ludger Küperkoch 2015-11-30 16:35:58 +01:00
parent 9f93c25aa8
commit 23b9fda5e4

View File

@ -6,7 +6,6 @@ Created August/September 2015.
:author: Ludger Küperkoch / MAGS2 EP3 working group :author: Ludger Küperkoch / MAGS2 EP3 working group
""" """
import pdb
import matplotlib.pyplot as plt import matplotlib.pyplot as plt
import numpy as np import numpy as np
from obspy.core import Stream from obspy.core import Stream
@ -19,7 +18,7 @@ class Magnitude(object):
amplitudes, local magnitudes and moment magnitudes. 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 :param: wfstream
:type: `~obspy.core.stream.Stream :type: `~obspy.core.stream.Stream
@ -43,8 +42,13 @@ class Magnitude(object):
self.setTo(To) self.setTo(To)
self.setpwin(pwin) self.setpwin(pwin)
self.setiplot(iplot) self.setiplot(iplot)
self.setw0(w0)
self.setrho(rho)
self.setdelta(delta)
self.setvp(vp)
self.calcwapp() self.calcwapp()
self.calcsourcespec() self.calcsourcespec()
self.calcMoMw()
def getwfstream(self): def getwfstream(self):
@ -71,6 +75,30 @@ class Magnitude(object):
def setiplot(self, iplot): def setiplot(self, iplot):
self.iplot = 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): def getwapp(self):
return self.wapp return self.wapp
@ -80,12 +108,22 @@ class Magnitude(object):
def getfc(self): def getfc(self):
return self.fc return self.fc
def getMo(self):
return self.Mo
def getMw(self):
return self.Mw
def calcwapp(self): def calcwapp(self):
self.wapp = None self.wapp = None
def calcsourcespec(self): def calcsourcespec(self):
self.sourcespek = None self.sourcespek = None
def calcMoMw(self):
self.Mo = None
self.Mw = None
class WApp(Magnitude): class WApp(Magnitude):
''' '''
Method to derive peak-to-peak amplitude as seen on a Wood-Anderson- Method to derive peak-to-peak amplitude as seen on a Wood-Anderson-
@ -136,6 +174,32 @@ class WApp(Magnitude):
plt.close(f) 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): class w0fc(Magnitude):
''' '''
Method to calculate the source spectrum and to derive from that the plateau 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" print ("w0fc: Determined w0-value: %e m/Hz, \n"
"Determined corner frequency: %f Hz" % (w01, fc1)) "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: if self.getiplot() > 1:
f1 = plt.figure() f1 = plt.figure()
plt.subplot(2,1,1) plt.subplot(2,1,1)
@ -215,13 +287,6 @@ class w0fc(Magnitude):
raw_input() raw_input()
plt.close(f1) 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): def synthsourcespec(f, omega0, fcorner):