Source code for pygmm.slope_displacement.rathje_saygili_2008

"""Rathje and Saygili (2008) rigid sliding-block displacement model."""

from __future__ import annotations

import numpy as np

from .._utils import dist_lognorm

__author__ = "Albert Kottke"

_COEFFS = {
    method: np.rec.fromrecords([values], names="a1,a2,a3,a4,a5,a6,a7")[0]
    for method, values in zip(
        ["mag", "pgv"],
        [
            (4.89, -4.85, -19.64, 42.49, -29.06, 0.72, 0.89),
            (-1.56, -4.58, -20.84, 44.75, -30.50, -0.64, 1.55),
        ],
        strict=True,
    )
}


[docs] @dist_lognorm def calc_disp_rs08( yield_coef: float, pga: float | np.ndarray, mag: float | None = None, pgv: float | None = None, **kwargs, ): """Rathje and Saygili (2008) slope displacement model. Two models are provided, selected by which of `mag` and `pgv` is given: - scalar model: PGA and magnitude - vector model: PGA and PGV Parameters ---------- yield_coef : float Slope yield coefficient [g]. pga : float or array_like Peak ground acceleration [g]. mag : float, optional Moment magnitude. pgv : float, optional Peak ground velocity [cm/s]. stats : bool, default False If True, return ``(ln_mean, ln_std)`` instead of the median. Returns ------- float or :class:`numpy.ndarray` Median displacement [cm], or ``(ln_mean, ln_std)`` if `stats` is True. """ if (mag is None) == (pgv is None): raise NotImplementedError("Provide only one of `mag` or `pgv`.") P = _COEFFS["pgv" if mag is None else "mag"] yp_ratio = yield_coef / np.asarray(pga) ln_disp = ( P.a1 + P.a2 * yp_ratio + P.a3 * yp_ratio**2 + P.a4 * yp_ratio**3 + P.a5 * yp_ratio**4 + P.a6 * np.log(pga) ) if mag is not None: ln_disp += P.a7 * (mag - 6) ln_std = 0.73 + 0.79 * yp_ratio - 0.54 * yp_ratio**2 elif pgv is not None: ln_disp += P.a7 * np.log(pgv) ln_std = 0.41 + 0.52 * yp_ratio return ln_disp, ln_std