Source code for pygmm.campbell_2003
"""Model for the Campbell (2003) ground motion model."""
import numpy as np
from . import model
__author__ = "Albert Kottke"
[docs]
class Campbell2003(model.GroundMotionModel):
"""Campbell (2003, :cite:`campbell03`) model.
This model was developed for the Eastern US.
Parameters
----------
scenario : :class:`pygmm.model.Scenario`
earthquake scenario
"""
NAME = "Campbell (2003)"
ABBREV = "C03"
# Reference velocity (m/sec)
V_REF = 2800.0
COEFF = model.load_data_file("campbell_2003.csv", 1)
PERIODS = COEFF["period"]
INDICES_PSA = np.arange(16)
PARAMS = [
model.NumericParameter("mag", True, 5.0, 8.2),
model.NumericParameter("dist_rup", True, None, 1000.0),
]
[docs]
def __init__(self, scenario: model.Scenario):
"""Initialize the model."""
super().__init__(scenario)
self._ln_resp = self._calc_ln_resp()
self._ln_std = self._calc_ln_std()
def _calc_ln_resp(self) -> np.ndarray:
"""Calculate the natural logarithm of the response.
Returns
-------
ln_resp : class:`np.array`:
natural log of the response
"""
c = self.COEFF
s = self._scenario
f_1 = c.c_2 * s.mag + c.c_3 * (8.5 - s.mag) ** 2
# Distance scaling
f_2 = (
c.c_4
* np.log(np.sqrt(s.dist_rup**2 + (c.c_7 * np.exp(c.c_8 * s.mag)) ** 2))
+ (c.c_5 + c.c_6 * s.mag) * s.dist_rup
)
# Geometric attenuation
r_1 = 70.0
r_2 = 130.0
if s.dist_rup <= r_1:
f_3 = 0.0
else:
f_3 = c.c_9 * (np.log(s.dist_rup) - np.log(r_1))
if r_2 < s.dist_rup:
f_3 += c.c_10 * (np.log(s.dist_rup) - np.log(r_2))
# Compute the ground motion
ln_resp = c.c_1 + f_1 + f_2 + f_3
return ln_resp
def _calc_ln_std(self) -> np.ndarray:
"""Calculate the logarithmic standard deviation.
Returns
-------
ln_std : class:`np.array`:
natural log standard deviation
"""
c = self.COEFF
s = self._scenario
if s.mag < 7.16:
ln_std = c.c_11 + c.c_12 * s.mag
else:
ln_std = c.c_13
return ln_std