Source code for pygmm.coppersmith_bommer_2014

"""Coppersmith and Bommer (2014) ground motion model, part of the PNNL Site
Wide Hazard."""

import numpy as np

from . import model
from .abrahamson_gregor_addo_2016 import AbrahamsonGregorAddo2016

__author__ = "Albert Kottke"


[docs] class CoppersmithBommer2014(AbrahamsonGregorAddo2016): """Coppersmith and Bommer (2014) ground motion model developed as part of the PNNL hazard study for the Hanford site. This model was developed for subduction regions and is a modified version of the BCHydro model. Parameters ---------- scenario : :class:`pygmm.model.Scenario` earthquake scenario """ NAME = "Coppersmith and Bommer (2014)" ABBREV = "CB14" # Load the coefficients for the model COEFF = model.load_data_file("coppersmith_bommer_2014.csv", 1) PERIODS = COEFF["period"] INDEX_PGA = 0 INDEX_PGV = None INDICES_PSA = np.arange(14) # FIXME LIMITS = dict( mag=(3.0, 8.5), dist_jb=(0.0, 300.0), v_s30=(150.0, 1500.0), ) PARAMS = [ model.NumericParameter("mag", True, 3, 8.5), model.NumericParameter("dist_rup", False), model.NumericParameter("v_s30", True, 150.0, 1500.0), model.CategoricalParameter("event_type", True, ["interface", "intraslab"]), ]
[docs] def __init__(self, scenario, scale_atten=1.0): """Initialize the model. Args: scenario (:class:`pygmm.model.Scenario`): earthquake scenario. """ super().__init__(scenario, adjust_c1=None, adjust_c4=0, scale_atten=scale_atten)
def _calc_ln_resp(self, pga_ref): """Calculate the natural logarithm of the response. Parameters ---------- pga_ref : float peak ground acceleration (g) at the reference condition. If :class:`np.nan`, then no site term is applied. Returns ------- ln_resp : class:`np.array`: natural log of the response """ s = self._scenario c = self.COEFF path_atten = (c.t_2 + c.t_3 * (s.mag - 7.8)) * np.log( s.dist_rup + c.c_4 * np.exp(c.t_9 * (s.mag - 6)) ) ln_resp = ( c.t_1 + c.t_4 * self.adjust_c1 + path_atten + self._scale_atten * c.t_6 * s.dist_rup + self._calc_f_mag(s.mag) + self._calc_f_site(pga_ref) + self._calc_f_faba(s.dist_rup) ) return ln_resp def _calc_f_faba(self, dist): """Calculate the forearc/backarc scaling. Equation 4. Parameters ---------- event_type : str type of subduction event, either: 'interface' or 'intraslab' dist : float depth to hypocenter [km] Returns ------- f_faba : class:`np.array`: forearc/backarc scaling """ c = self.COEFF f_faba = c.t_16 * np.log(np.maximum(dist, 40) / 40) return f_faba