Source code for pygmm.abrahamson_bhasin_2020

"""Abrahamson and Bhasin (2020, :cite:`abrahamson20`) model."""

from typing import Optional

import numpy as np

from . import model

__author__ = "Albert Kottke"


[docs] class AbrahamsonBhasin2020(model.Model): """Abrahamson (2020, :cite:`abrahamson20`) model. Conditional PGV model Parameters ---------- scenario : :class:`pygmm.model.Scenario` earthquake scenario """ NAME = "Abrahamson and Bhasin (2020)" ABBREV = "AB20" # Reference velocity (m/s) V_REF = 425.0 # Load the coefficients for the model COEFFS = { # From Table 3.2 "psa(T=Tpgv)": model.Coefficients( a_1=5.39, a_2=0.799, a_3=0.654, a_4=0.479, a_5=-0.062, a_6=-0.359, a_7=-0.134, a_8=0.023, phi=0.29, tau=0.16, ), "pga": model.Coefficients( a_1=4.77, a_2=0.738, a_3=0.484, a_4=0.275, a_5=-0.036, a_6=-0.332, a_7=-0.44, a_8=0, phi_1=0.32, phi_2=0.42, tau_1=0.12, tau_2=0.26, M_1=5.0, M_2=7.0, ), "psa(T=1s)": model.Coefficients( a_1=4.80, a_2=0.82, a_3=0.55, a_4=0.27, a_5=0.054, a_6=-0.382, a_7=-0.21, a_8=0.0, phi_1=0.28, phi_2=0.38, tau_1=0.12, tau_2=0.17, M_1=5.0, M_2=7.0, ), } PARAMS = [ model.NumericParameter("dist_rup", True, 0, 300), model.NumericParameter("mag", True, 3.0, 8.0), model.NumericParameter("v_s30", True, 180, 1500), ]
[docs] def __init__( self, scenario: model.Scenario, psa=Optional[float], pga=Optional[float], psa_1s=Optional[float], ): super().__init__(scenario) if psa is not None: method = "psa(T=Tpgv)" # FIXME: How to interpolate? raise NotImplementedError elif pga is not None: method = "pga" ln_gm = np.log(pga) else: method = "psa(T=1s)" ln_gm = np.log(psa_1s) C = self.COEFFS[method] s = scenario # Mean if s.mag < 5: f_1 = C.a_2 elif s.mag > 7.5: f_1 = C.a_3 else: f_1 = C.a_2 + (C.a_3 - C.a_2) * (s.mag - 5) / 2.5 ln_mean = ( C.a_1 + f_1 * ln_gm + C.a_4 * (s.mag - 6) + C.a_5 * (8.5 - s.mag) ** 2 + C.a_6 * np.log(s.dist_rup + 5 * np.exp(0.4 * (s.mag - 6))) + (C.a_7 + C.a_8 * (s.mag - 5)) * np.log(C.v_s30 / self.V_REF) ) if method == "psa(T=Tpgv)": phi, tau = C.phi, C.tau else: def interp(var_1, var_2): if s.mag < C.mag_1: val = var_1 elif s.mag > C.mag_2: val = var_2 else: val = var_1 + (var_2 - var_1) * (s.mag - C.mag_1) / ( C.mag_2 - C.mag_1 ) return val phi = interp(C.phi_1, C.phi_2) tau = interp(C.tau_1, C.tau_2) ln_std = np.sqrt(phi**2 + tau**2) return ln_mean, ln_std
[docs] @classmethod def ln_period_pgv(cls, mag: float) -> float: """Natural logarithm of the period for calculating PGV. Equation 3.6. Parameters ---------- mag : float Magnitude Returns ------- ln_period_pgv : float Best period for computing PGV. """ return -4.09 + 0.66 * mag