Source code for shakelib.correlation.goda_atkinson_2010
import numpy as np
import numexpr as ne
[docs]class GodaAtkinson2010(object):
"""
Imlements the Goda and Atkinson (2010) spatial correlation model for IMTs.
To do
- Inherit from SpatialCorrelation class.
References:
Goda, K., & Atkinson, G. M. (2010). Intraevent spatial correlation of
ground-motion parameters using SK-net data. Bulletin of the
Seismological Society of America, 100(6), 3055-3067.
`[link] <http://www.bssaonline.org/content/100/6/3055.short>`__
"""
[docs] @staticmethod
def getSpatialCorrelation(dists, imt):
"""
Method for evalulating spatial correlation model.
Args:
dists (ndarray): Numpy array of distances (km).
imt (IMT): Openquake intensity measure type instance.
`[link] <http://docs.openquake.org/oq-hazardlib/master/imt.html>`__
Returns:
ndarray: Numpy array of correlation values.
""" # noqa
if 'PGA' in imt:
alpha = 0.060
beta = 0.283
gamma = 5.0
elif 'PGV' in imt:
# Here we use the average values because there is no PGV in G&A
alpha = 0.054
beta = 0.319
gamma = 5.0
elif 'SA' in imt:
pp = imt.period
if pp == 0.1:
alpha = 0.062
beta = 0.276
gamma = 5.0
elif pp == 0.2:
alpha = 0.073
beta = 0.248
gamma = 5.0
elif pp == 0.3:
alpha = 0.086
beta = 0.219
gamma = 5.0
elif pp == 0.5:
alpha = 0.073
beta = 0.248
gamma = 5.0
elif pp == 1.0:
alpha = 0.051
beta = 0.329
gamma = 5.0
elif pp == 2.0:
alpha = 0.061
beta = 0.421
gamma = 3.035
elif pp == 3.0:
alpha = 0.092
beta = 0.671
gamma = 1.189
elif pp == 5.0:
alpha = 0.071
beta = 0.741
gamma = 1.201
else:
# Here we use the average values because we don't have terms
# for this period
alpha = 0.054
beta = 0.319
gamma = 5.0
else:
# Again we use the average values because we don't know the IMT
alpha = 0.054
# Variable used within ne.evaluate, not seen by linter
beta = 0.319 # noqa
gamma = 5.0
pass
nal = -1.0 * alpha # noqa
gm1 = gamma - 1.0 # noqa
# cor = 1.0 - np.sqrt(1.0 - np.maximum(
# gamma * np.exp(nal * np.power(dists, beta)) - gm1,
# 0))
# tmp = ne.evaluate("gamma * exp(nal * dists**beta) - gm1")
# tmp[tmp < 0] = 0
# cor = ne.evaluate("1.0 - sqrt(1.0 - tmp)")
cor = ne.evaluate(
"1.0 - sqrt(1.0 - (gamma * exp(nal * dists**beta) - gm1))")
# cor[cor < 0] = 0
return np.clip(cor, 0, 1)