Source code for pygmm.slope_displacement.bray_et_al_2017
"""Bray et al. (2017) displacement model for subduction-zone events."""
from __future__ import annotations
import numpy as np
from scipy.stats import norm
from .._utils import dist_lognorm
__author__ = "Albert Kottke"
[docs]
@dist_lognorm
def calc_disp_bea17(
yield_coef: float, period_slide: float, psa_dts: float, mag: float, **kwds
):
"""Bray et al. (2017) median non-zero displacement for subduction events.
Parameters
----------
yield_coef : float
Slope yield coefficient [g].
period_slide : float
Fundamental period of the sliding mass, :math:`T_s` [s].
psa_dts : float
5%-damped spectral acceleration at the degraded period,
:math:`1.5 T_s` [g].
mag : float
Moment magnitude.
stats : bool, default False
If True, return ``(ln_mean, ln_std)`` instead of the median.
Returns
-------
float
Median displacement [cm], or ``(ln_mean, ln_std)`` if `stats` is True.
"""
ln_yield_coef = np.log(yield_coef)
ln_psa_dts = np.log(psa_dts)
ln_mean = (
-3.535 * ln_yield_coef
- 0.390 * ln_yield_coef**2
+ 0.538 * ln_yield_coef * ln_psa_dts
+ 3.060 * ln_psa_dts
- 0.225 * ln_psa_dts**2
+ 0.550 * mag
)
if np.isclose(period_slide, 0.0):
ln_mean -= 5.864
else:
if period_slide < 0.1:
a1, a2, a3 = -5.864, -9.421, 0.0
else:
a1, a2, a3 = -6.896, 3.081, -0.803
ln_mean += a1 + a2 * period_slide + a3 * period_slide**2
ln_std = 0.73
return ln_mean, ln_std
[docs]
def calc_prob_disp_bea17(
yield_coef: float, period_slide: float, psa_dts: float, **kwds
) -> float:
"""Bray et al. (2017) probability of non-zero displacement.
Parameters are as for :func:`calc_disp_bea17`.
Returns
-------
float
Probability of a non-zero displacement.
"""
ln_yield_coef = np.log(yield_coef)
if period_slide <= 0.7:
z = (
-2.64
- 3.20 * ln_yield_coef
- 0.17 * ln_yield_coef**2
- 0.49 * period_slide * ln_yield_coef
+ 2.09 * period_slide
+ 2.91 * np.log(psa_dts)
)
else:
z = (
-3.53
- 4.78 * ln_yield_coef
- 0.34 * ln_yield_coef**2
- 0.30 * period_slide * ln_yield_coef
- 0.67 * period_slide
+ 2.66 * np.log(psa_dts)
)
return norm.cdf(z)