# -*- coding: utf-8 -*-
# vim: tabstop=4 shiftwidth=4 softtabstop=4
#
# Copyright (C) 2015-2023 GEM Foundation
#
# OpenQuake is free software: you can redistribute it and/or modify it
# under the terms of the GNU Affero General Public License as published
# by the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# OpenQuake is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with OpenQuake. If not, see <http://www.gnu.org/licenses/>.
"""
Module exports :class:`AbrahamsonGulerce2020SInter`,
:class:`AbrahamsonGulerce2020SSlab`
"""
import numpy as np
from openquake.hazardlib.gsim.base import GMPE, CoeffsTable, add_alias
from openquake.hazardlib import const
from openquake.hazardlib.imt import PGA, SA
from openquake.hazardlib.gsim.utils_usgs_basin_scaling import \
_get_z2pt5_usgs_basin_scaling
# The regions for which the model is supported. If not listed then the
# global model (GLO) should be applied
SUPPORTED_REGIONS = ["GLO", "USA-AK", "CAS", "CAM", "JPN", "NZL", "SAM", "TWN"]
# Region-specific constants or references to the corresponding column
# of the coefficients table
REGIONAL_TERMS = {
"GLO": {
"C1s": 7.5,
"a1": "a1",
},
"USA-AK": {
"C1s": 7.9, # In-slab magnitude scaling breakpoint
"a1": "a31", # Region-specific base constant
"a2-adj": None, # Adjustment to the geometric spreading term
"a6-adj": "a24", # Adjustment to the anelastic attenuation term
"a12-adj": "a17", # Adjustment to the linear Vs30 scaling term
"Z25-adj": None, # Adjustment to the basin depth scaling term
},
"CAS": {
"C1s": 7.1,
"a1": "a32",
"a2-adj": None,
"a6-adj": "a25",
"a12-adj": "a18",
"Z25-adj": "a39",
},
"CAM": {
"C1s": 7.4,
"a1": "a33",
"a2-adj": None,
"a6-adj": "a26",
"a12-adj": "a19",
"Z25-adj": None,
},
"JPN": {
"C1s": 7.6,
"a1": "a34",
"a2-adj": None,
"a6-adj": "a27",
"a12-adj": "a20",
"Z25-adj": "a41",
},
"NZL": {
"C1s": 8.0,
"a1": "a35",
"a2-adj": None,
"a6-adj": "a28",
"a12-adj": "a21",
"Z25-adj": None,
},
"SAM": {
"C1s": 7.5,
"a1": "a36",
"a2-adj": None,
"a6-adj": "a29",
"a12-adj": "a22",
"Z25-adj": None,
},
"TWN": {
"C1s": 7.7,
"a1": "a37",
"a2-adj": "a16",
"a6-adj": "a30",
"a12-adj": "a23",
"Z25-adj": None,
},
}
# Region- and period-independent constant values
CONSTS = {
"C4": 10.0,
"a3": 0.1,
"a4": 0.73,
"a5": 0.0,
"a9": 0.4,
"a15": -0.1,
"a17": 0.0,
"a19": 0.0,
"a45": 0.34,
"d0": 0.47,
"n": 1.18,
"c": 1.88,
"tau_lin": 0.47,
"phi_amp": 0.3,
"alpha_phi3": 0.42,
"T1_phi2": 0.03,
"T2_phi2": 0.075,
"T3_phi2": 0.20,
"T4_phi2": 1.0,
"T1_phi3": 0.03,
"T2_phi3": 0.075,
"T3_phi3": 0.10,
"T4_phi3": 0.3,
"d3_phi2": 0.109,
"d4_phi2": 0.062,
"d5_phi2": 0.470,
"d3_phi3": 0.242,
"d4_phi3": 0.000,
"d5_phi3": 0.000,
}
[docs]def get_base_term(C, region, apply_adjust):
"""
Returns the region-specific base term (a1 - Equation 3.1)
:param C:
Coefficient dictionary for the specfic IMT
:param str region:
Region identifier
:param bool apply_adjust:
For Alaska and Cascadia apply the modeller-defined adjustment factors
to the base term (True) or else leave regionalised but unadjusted
(False)
"""
if region in ("USA-AK", "CAS") and apply_adjust:
# For Alaska and Cascdia, apply the adjustments to the coefficient a1
return C[REGIONAL_TERMS[region]["a1"]] + C["{:s}_Adj".format(region)]
else:
return C[REGIONAL_TERMS[region]["a1"]]
[docs]def get_magnitude_scaling_term(C, trt, region, mag):
"""
Returns the magnitude scaling term (defined in Eq 3.3) and regional
constant
:param str trt:
Tectonic region type
:param np.ndarray mag:
Earthquake magnitude
"""
f_mag_quad = C["a13"] * ((10.0 - mag) ** 2.0)
a4 = CONSTS["a4"]
if trt == const.TRT.SUBDUCTION_INTERFACE:
c1 = C["c1i"]
else:
c1 = REGIONAL_TERMS[region]["C1s"]
a4 += CONSTS["a45"]
f_mag = np.where(mag <= c1,
f_mag_quad + a4 * (mag - c1),
f_mag_quad + CONSTS["a5"] * (mag - c1))
return f_mag
[docs]def get_geometric_spreading_term(C, region, mag, rrup):
"""
Returns the geometric spreading term defined in equation 3.1
:param numpy.ndarray rrup:
Rupture distances (km)
"""
a_2 = C["a2"]
if region == "TWN":
a_2 += C[REGIONAL_TERMS[region]["a2-adj"]]
f_r = a_2 + CONSTS["a3"] * (mag - 7.0)
hff = CONSTS["C4"] * np.exp(CONSTS["a9"] * (mag - 6.0))
f_r *= np.log(rrup + hff)
return f_r
[docs]def get_anelastic_attenuation_term(C, region, rrup):
"""
Returns the regionally-adjusted anelastic attenuation term
"""
a_6 = C["a6"]
if region != "GLO":
a_6 += C[REGIONAL_TERMS[region]["a6-adj"]]
return a_6 * rrup
[docs]def get_inslab_scaling_term(C, trt, region, mag, rrup):
"""
For inslab events, returns the inslab scaling term defined in equation 3.5
and corrected in the Erratum
"""
if trt == const.TRT.SUBDUCTION_INTERFACE:
# Doesn't apply to interface events
return 0.0
hff = 10.0 * np.exp(CONSTS["a9"] * (mag - 6.0))
c1s = REGIONAL_TERMS[region]["C1s"]
return C["a10"] + (CONSTS["a4"] + CONSTS["a45"]) * (c1s - 7.5) +\
C["a14"] * np.log(rrup + hff)
[docs]def get_rupture_depth_scaling_term(C, trt, ctx):
"""
Returns the rupture depth scaling described in Equation 3.6, which takes
the value 0 for interface events
:param numpy.ndarray ztor:
Top of rupture depths (km)
"""
if trt == const.TRT.SUBDUCTION_INTERFACE:
# Not defined for interface events
return 0.0
if isinstance(ctx.ztor, np.ndarray):
f_dep = C["a11"] * (ctx.ztor - 50.0)
f_dep[ctx.ztor > 200.0] = C["a11"] * 150.0
idx = ctx.ztor <= 50.0
f_dep[idx] = C["a8"] * (ctx.ztor[idx] - 50.0)
elif ctx.ztor > 200.0:
f_dep = C["a11"] * 150.0
elif ctx.ztor <= 50.0:
f_dep = C["a8"] * (ctx.ztor - 50.0)
else:
f_dep = C["a11"] * (ctx.ztor - 50.0)
return f_dep
[docs]def get_site_amplification_term(C, region, vs30, pga1000):
"""
Returns the shallow site amplification term as descrbied in Equation 3.7,
and corrected in the Erratum
:param numpy.ndarray vs30:
30-m averaged shearwave velocity (m/s)
:param numpy.ndarray pga1000:
Peak Ground Acceleration (PGA), g, on a reference bedrock of 1000 m/s
"""
a12 = C["a12"]
if region != "GLO":
# Apply regional adjustment
a12 += C[REGIONAL_TERMS[region]["a12-adj"]]
# V* is defined according to Equation 3.8 (i.e. Vs30 clipped at 1000 m/s
# in the Erratum)
vstar = np.clip(vs30, -np.inf, 1000.0)
vnorm = vstar / C["vlin"]
fsite = a12 * np.log(vnorm)
idx = vstar >= C["vlin"]
# Linear site term
fsite[idx] += (C["b"] * CONSTS["n"] * np.log(vnorm[idx]))
idx = np.logical_not(idx)
# Nonlinear site term
fsite[idx] += C["b"] * (
np.log(pga1000[idx] + CONSTS["c"] * (vnorm[idx] ** CONSTS["n"])) -
np.log(pga1000[idx] + CONSTS["c"])
)
return fsite
[docs]def get_reference_basin_depth(region, vs30):
"""
For the Cascadia and Japan regions a reference basin depth, dependent
on the Vs30, is returned according to equations 2.1 and 2.2
"""
if region == "CAS":
ln_zref = np.clip(8.52 - 0.88 * np.log(vs30 / 200.0), 7.6, 8.52)
elif region == "JPN":
ln_zref = np.clip(7.3 - 2.066 * np.log(vs30 / 170.0), 4.1, 7.3)
else:
raise ValueError("No reference basin depth term defined for region %s"
% region)
return np.exp(ln_zref)
def _get_basin_term(C, ctx, region, usgs_baf):
"""
Returns the basin depth scaling term, applicable only for the Cascadia
and Japan regions, defined in equations 3.9 - 3.11 and corrected in the
Erratum
:param numpy.ndarray z25:
Depth to 2.5 m/s shearwave velocity layer (km)
"""
if region not in ("CAS", "JPN"):
# Basin depth defined only for Cascadia and Japan, so return 0
return 0.0
# Convert z25 from km to m
z25 = 1000.0 * ctx.z2pt5
# Define the reference basin depth from Vs30
z25_ref = get_reference_basin_depth(region, ctx.vs30)
# Normalise the basin depth term (Equation 3.9)
ln_z25_prime = np.log((z25 + 50.0) / (z25_ref + 50.0))
f_basin = np.zeros(ctx.vs30.shape)
if region == "JPN":
# Japan Basin (Equation 3.10)
f_basin = C["a41"] * np.clip(ln_z25_prime, -2.0, np.inf)
else:
# Cascadia Basin (Equation 3.11)
idx = ln_z25_prime > 0.0
f_basin[idx] = C["a39"] * ln_z25_prime[idx] * usgs_baf[idx]
return f_basin
[docs]def get_acceleration_on_reference_rock(C, trt, region, ctx, apply_adjustment):
"""
Returns acceleration on reference rock - intended for use primarily with
PGA. Overrides the Vs30 values and removes any basin depth terms
"""
# Set all Vs30 to 1000 m/s
vs30 = np.full_like(ctx.vs30, 1000.)
# On rock the amplification is only linear, so PGA1000 is not used
# set to a null array
null_pga1000 = np.zeros(vs30.shape)
# No basin depth is calculated here
return (get_base_term(C, region, apply_adjustment) +
get_magnitude_scaling_term(C, trt, region, ctx.mag) +
get_geometric_spreading_term(C, region, ctx.mag, ctx.rrup) +
get_anelastic_attenuation_term(C, region, ctx.rrup) +
get_rupture_depth_scaling_term(C, trt, ctx) +
get_inslab_scaling_term(C, trt, region, ctx.mag, ctx.rrup) +
get_site_amplification_term(C, region, vs30, null_pga1000))
[docs]def get_mean_acceleration(C, trt, region, ctx, pga1000, apply_adjustment,
usgs_baf):
"""
Returns the mean acceleration on soil
"""
return (get_base_term(C, region, apply_adjustment) +
get_magnitude_scaling_term(C, trt, region, ctx.mag) +
get_geometric_spreading_term(C, region, ctx.mag, ctx.rrup) +
get_anelastic_attenuation_term(C, region, ctx.rrup) +
get_rupture_depth_scaling_term(C, trt, ctx) +
get_inslab_scaling_term(C, trt, region, ctx.mag, ctx.rrup) +
get_site_amplification_term(C, region, ctx.vs30, pga1000) +
_get_basin_term(C, ctx, region, usgs_baf))
def _get_f2(t1, t2, t3, t4, alpha, period):
"""
Returns the linear phi short-period scaling term (f2) defined in
equation 5.3 and corrected in the Erratum
"""
if period <= t1:
f2 = 1.0 - alpha
elif period <= t2:
f2 = 1.0 - alpha * (np.log(period / t2) / np.log(t1 / t2))
elif period <= t3:
f2 = 1.0
elif period < t4:
f2 = np.log(period / t4) / np.log(t3 / t4)
else:
f2 = 0.0
return f2
def _get_a_phi2(rrup, d3, d4, d5):
"""
Returns Aphi, the short period linear phi normalising factor to be
added to the base linear within-event term, as defined in Equation 5.4
"""
rrup_norm = (rrup - 225.0) / 225.0
a_phi2 = d3 + d4 * rrup_norm + d5 * (rrup_norm ** 2.)
a_phi2[rrup < 225] = d3
a_phi2[rrup > 450.0] = d3 + d4 + d5
return a_phi2
[docs]def get_phi_lin_model(C, C_PGA, region, period, rrup):
"""
Returns the distance-dependent linear phi term for both PGA and the
required spectral period. The term is regionally dependent with additional
factors added on for Central America, Japan and South America
Several equations are used here, described fully in section 5.3
:param float period:
Spectral period of ground motion
"""
# Define phi1 term according to equation 5.2
rrup_norm = (rrup - 150.0) / 300.0
phi1_sq = np.clip(C["d1"] + C["d2"] * rrup_norm,
C["d1"],
C["d1"] + C["d2"])
phi1_sq_pga = np.clip(C_PGA["d1"] + C_PGA["d2"] * rrup_norm,
C_PGA["d1"],
C_PGA["d1"] + C_PGA["d2"])
if region in ("USA-AK", "CAS", "NZL", "TWN", "GLO"):
# For Alaska, Cascadia, New Zealand and Taiwan then phi_lin corresponds
# only to phi1
return np.sqrt(phi1_sq), np.sqrt(phi1_sq_pga)
# Phi 2 model
# Alpha according to equation 5.6
alpha = np.clip(1.0 - 0.0036 * (rrup - 250.0), 0.28, 1.0)
# Retrieve the specific corner periods needed for phi2
t1, t2, t3, t4 = CONSTS["T1_phi2"], CONSTS["T2_phi2"], CONSTS["T3_phi2"],\
CONSTS["T4_phi2"]
# Retrieve the function describing the trapezoidal shape of the increase
# in linear phi at short periods
f2_phi2 = _get_f2(t1, t2, t3, t4, alpha, period)
f2_phi2_pga = 1.0 - alpha
# Retrieve constants needed for the amplitude scaling factor for
# the phi2 increase
d3, d4, d5 = CONSTS["d3_phi2"], CONSTS["d4_phi2"], CONSTS["d5_phi2"]
a_phi2 = _get_a_phi2(rrup, d3, d4, d5)
phi2_sq = a_phi2 * f2_phi2
phi2_sq_pga = a_phi2 * f2_phi2_pga
if region == "CAM":
# For Central America and Mexico only the phi1 and phi2 terms are used
return np.sqrt(phi1_sq + phi2_sq), np.sqrt(phi1_sq_pga + phi2_sq_pga)
# Phi 3 model - applies to Japan and South America
# Alpha term is constant
alpha = CONSTS["alpha_phi3"]
# Retrieve normalised phi_lin scaling function
t1, t2, t3, t4 = CONSTS["T1_phi3"], CONSTS["T2_phi3"], CONSTS["T3_phi3"],\
CONSTS["T4_phi3"]
f2_phi3 = _get_f2(t1, t2, t3, t4, alpha, period)
f2_phi3_pga = 1.0 - alpha
# In this case the amplitude of additional variance is constant
a_phi3 = CONSTS["d3_phi3"]
phi3_sq = a_phi3 * f2_phi3
phi3_sq_pga = a_phi3 * f2_phi3_pga
return np.sqrt(phi1_sq + phi2_sq + phi3_sq),\
np.sqrt(phi1_sq_pga + phi2_sq_pga + phi3_sq_pga)
[docs]def get_partial_derivative_site_pga(C, vs30, pga1000):
"""
Defines the partial derivative of the site term with respect to the PGA
on reference rock, described in equation 5.9 (corrected in Erratum)
"""
dfsite_dlnpga = np.zeros(vs30.shape)
vstar = np.clip(vs30, -np.inf, 1000.0)
idx = vstar <= C["vlin"]
vnorm = vstar[idx] / C["vlin"]
dfsite_dlnpga[idx] = C["b"] * pga1000 * (
(-1.0 / (pga1000 + CONSTS["c"])) +
(1.0 / (pga1000 + CONSTS["c"] * (vnorm ** CONSTS["n"])))
)
return dfsite_dlnpga
[docs]def get_tau_phi(C, C_PGA, region, period, rrup, vs30, pga1000, ergodic):
"""
Get the heteroskedastic within-event and between-event standard deviation
"""
# Get the site-to-site variability
if region == "CAM":
phi_s2s = C["phi_s2s_g2"]
phi_s2s_pga = C_PGA["phi_s2s_g2"]
elif region in ("JPN", "SAM"):
phi_s2s = C["phi_s2s_g3"]
phi_s2s_pga = C_PGA["phi_s2s_g3"]
else:
phi_s2s = C["phi_s2s_g1"]
phi_s2s_pga = C["phi_s2s_g1"]
# Get linear tau and phi
# linear tau is period independent
tau = CONSTS["tau_lin"] * np.ones(vs30.shape)
phi_lin, phi_lin_pga = get_phi_lin_model(C, C_PGA, region, period, rrup)
# Find the sites where nonlinear site terms apply
idx = np.clip(vs30, -np.inf, 1000) < C["vlin"]
if not np.any(idx):
# Only linear term
if ergodic:
return tau, phi_lin
else:
# Remove the site-to-site variability from phi
phi = np.sqrt(phi_lin ** 2.0 - phi_s2s ** 2.0)
return tau, phi
# Process the nonlinear site terms
phi = phi_lin.copy()
partial_f_pga = get_partial_derivative_site_pga(C, vs30[idx], pga1000[idx])
phi_b = np.sqrt(phi_lin[idx] ** 2.0 - CONSTS["phi_amp"] ** 2.0)
phi_b_pga = np.sqrt(phi_lin_pga[idx] ** 2.0 - CONSTS["phi_amp"] ** 2.0)
# Get nonlinear tau and phi terms
tau_sq = tau[idx] ** 2.0
tau_sq = tau_sq + (partial_f_pga ** 2.0) * tau_sq +\
2.0 * partial_f_pga * tau_sq * C["rhoB"]
phi_nl_sq = (phi_lin[idx] ** 2.0) +\
(partial_f_pga ** 2.0) * (phi_b_pga ** 2.0) +\
(2.0 * partial_f_pga * phi_b_pga * phi_b * C["rhoW"])
tau[idx] = np.sqrt(tau_sq)
phi[idx] = np.sqrt(phi_nl_sq)
if not ergodic:
# Need to update the nonlinear within-event variability term to remove
# the site-to-site variability
phi_ss = np.sqrt(phi_lin ** 2.0 - phi_s2s ** 2.0)
phi_ss_pga = np.sqrt(phi_lin_pga ** 2.0 - phi_s2s_pga ** 2.0)
phi_ss_b = np.sqrt(phi_ss[idx] ** 2.0 - CONSTS["phi_amp"] ** 2.0)
phi_ss_b_pga = np.sqrt(phi_ss_pga[idx] ** 2.0 -
CONSTS["phi_amp"] ** 2.0)
phi_ss_nl_sq = (phi_ss[idx] ** 2.0) +\
(partial_f_pga ** 2.0) * (phi_ss_b_pga ** 2.0) +\
(2.0 * partial_f_pga * phi_ss_b_pga * phi_ss_b * C["rhoW"])
phi_ss[idx] = np.sqrt(phi_ss_nl_sq)
return tau, phi_ss
return tau, phi
[docs]def get_epistemic_adjustment(C, rrup):
"""
Returns the distance-dependent epistemic adjustment factor defined in
equation 6.1. In theory, this should only be applied to the global
model, but we do not enforce this constraint here.
"""
rrup_norm = np.clip(rrup, 50.0, 500.0) / 100.0
return C["e1"] + C["e2"] * rrup_norm + C["e3"] * (rrup_norm ** 2.0)
[docs]class AbrahamsonGulerce2020SInter(GMPE):
"""
Implements the 2020 Subduction ground motion model of Abrahamson &
Gulerce (2020):
Abrahamson N. and Gulurce Z. (2020) "Regionalized Ground-Motion Models
for Subduction Earthquakes based on the NGA-SUB Database", Pacific
Earthquake Engineering Research Center (PEER) Technical Report,
PEER 2020/25
The model is regionalised, defining specific adjustment factors for
(invoking region term in parenthesis):
- Global ("GLO" - for application to any subduction region for which
no region-specific adjustment is defined)
- Alaska ("USA-AK")
- Cascadia ("CAS")
- Central America & Mexico ("CAM")
- Japan ("JPN")
- New Zealand ("NZL")
- South America ("SAM")
- Taiwan ("TWN")
The region-specific adjustments primarily affect the constant term,
the anelastic attenuation term and the linear Vs30 scaling term. In
addition, however, further period-specific adjustment factors can be
applied for the Alaska and Cascadia regions using the boolean
input `apply_adjustment`. These adjustments scale the resulting
ground motion values to appropriate levels accounting for limited data
and the Alaska and Cascadia region, based on analysis undertaken by
the authors.
A general epistemic uncertainty median adjustment factor is also defined
based on the standard deviation of the median ground motion from five
regions with estimated regional terms. This term should be applied only
to the global model (though this is not strictly enforced), and it is
controlled via the use of `sigma_mu_epsilon`, the number of standard
deviations by which the adjustment will be multiplied (default = 0)
A non-ergodic aleatory uncertainty model can be returned by setting
`ergodic=False`.
The code implementation and test tables have been verified using
Fortran code supplied by Professor N. Abrahamson, and cross-checked against
an independent implementation from Feng Li, Jason Motha and James Paterson
from University of Canterbury (New Zealand).
Attributes:
region (str): Choice of region among the supported regions ("GLO",
"USA-AK", "CAS", "CAM", "JPN", "NZL", "SAM", "TWN")
ergodic (bool): Return the ergodic aleatory variability model (True)
or non-ergodic form (False)
apply_usa_adjustment (bool): Apply the modeller designated Alaska or
Cascadia adjustments (available only for
the regions "USA-AK" or "CAS")
usgs_basin_scaling (bool): Scaling factor to be applied to basin term
based on USGS basin model
sigma_mu_epsilon (float): Number of standard deviations to multiply
sigma mu (the standard deviation of the
median) for the epistemic uncertainty model
"""
#: Supported tectonic region type is subduction interface
DEFINED_FOR_TECTONIC_REGION_TYPE = const.TRT.SUBDUCTION_INTERFACE
#: Supported intensity measure types are spectral acceleration,
#: and peak ground acceleration
DEFINED_FOR_INTENSITY_MEASURE_TYPES = {PGA, SA}
#: Supported intensity measure component is RotD50
DEFINED_FOR_INTENSITY_MEASURE_COMPONENT = const.IMC.RotD50
#: Supported standard deviation types are inter-event, intra-event
#: and total, see section 4.5
DEFINED_FOR_STANDARD_DEVIATION_TYPES = {
const.StdDev.TOTAL, const.StdDev.INTER_EVENT, const.StdDev.INTRA_EVENT}
#: Site amplification is dependent only upon Vs30 for the majority of cases
#: but Z2.5 is added for the JPN and CAS regions
REQUIRES_SITES_PARAMETERS = {'vs30', }
#: Required rupture parameters are only magnitude for the interface model
REQUIRES_RUPTURE_PARAMETERS = {'mag', }
#: Required distance measure is closest distance to rupture, for
#: interface events
REQUIRES_DISTANCES = {'rrup', }
#: Defined for a reference velocity of 1000 m/s
DEFINED_FOR_REFERENCE_VELOCITY = 1000.0
# Other required params
REQUIRES_ATTRIBUTES = {'region', 'ergodic', 'apply_usa_adjustment',
'usgs_basin_scaling', 'sigma_mu_epsilon'}
def __init__(self, region="GLO", ergodic=True, apply_usa_adjustment=False,
usgs_basin_scaling=False, sigma_mu_epsilon=0.0):
assert region in SUPPORTED_REGIONS, "Region %s not supported by %s" \
% (region, self.__class__.__name__)
self.region = region
self.ergodic = ergodic
self.apply_usa_adjustment = apply_usa_adjustment
self.usgs_basin_scaling = usgs_basin_scaling
self.sigma_mu_epsilon = sigma_mu_epsilon
# If running for Cascadia or Japan then z2.5 is needed
if region in ("CAS", "JPN"):
self.REQUIRES_SITES_PARAMETERS = \
self.REQUIRES_SITES_PARAMETERS.union({"z2pt5", })
# USGS basin scaling only used if region is set to Cascadia
if self.usgs_basin_scaling and self.region != "CAS":
raise ValueError('USGS basin scaling is only applicable to the '
'Cascadia region for AbrahamsonGulerce2020.')
[docs] def compute(self, ctx: np.recarray, imts, mean, sig, tau, phi):
"""
See :meth:`superclass method
<.base.GroundShakingIntensityModel.compute>`
for spec of input and result values.
"""
trt = self.DEFINED_FOR_TECTONIC_REGION_TYPE
C_PGA = self.COEFFS[PGA()]
pga1000 = get_acceleration_on_reference_rock(C_PGA, trt,
self.region, ctx,
self.apply_usa_adjustment)
pga1000 = np.exp(pga1000)
for m, imt in enumerate(imts):
C = self.COEFFS[imt]
# Get USGS basin scaling factor if required (can only be for
# CAS region)
if self.usgs_basin_scaling:
usgs_baf = _get_z2pt5_usgs_basin_scaling(ctx.z2pt5, imt.period)
else:
usgs_baf = np.ones(len(ctx.vs30))
mean[m] = get_mean_acceleration(C, trt, self.region, ctx, pga1000,
self.apply_usa_adjustment, usgs_baf)
if self.sigma_mu_epsilon:
# Apply an epistmic adjustment factor
mean[m] += (self.sigma_mu_epsilon *
get_epistemic_adjustment(C, ctx.rrup))
# Get the standard deviations
tau_m, phi_m = get_tau_phi(C, C_PGA, self.region, imt.period,
ctx.rrup, ctx.vs30, pga1000,
self.ergodic)
tau[m] = tau_m
phi[m] = phi_m
sig += np.sqrt(tau ** 2.0 + phi ** 2.0)
# Coefficients taken from digital files supplied by Norm Abrahamson
COEFFS = CoeffsTable(sa_damping=5, table="""\
imt c1i vlin b a1 a2 a6 a7 a8 a10 a11 a12 a13 a14 a16 a17 a18 a19 a20 a21 a22 a23 a24 a25 a26 a27 a28 a29 a30 a31 a32 a33 a34 a35 a36 a37 a39 a41 USA-AK_Adj CAS_Adj d1 d2 rhoW rhoB phi_s2s_g1 phi_s2s_g2 phi_s2s_g3 e1 e2 e3
pga 8.20 865.1 -1.186 4.5960 -1.4500 -0.0043 3.2100 0.0440 3.210 0.0070 0.9000 0.0000 -0.4600 0.0900 0.000 -0.2000 0.000 0.0000 0.0400 0.0400 0.0000 0.0015 0.0007 0.0036 -0.0004 0.0025 0.0006 0.0033 3.7783 3.3468 3.8025 5.0361 4.6272 4.8044 3.5669 0.000 -0.029 0.487 0.828 0.325 0.137 1.000 1.000 0.396 0.396 0.545 0.550 -0.270 0.050
0.010 8.20 865.1 -1.186 4.5960 -1.4500 -0.0043 3.2100 0.0440 3.210 0.0070 0.9000 0.0000 -0.4600 0.0900 0.000 -0.2000 0.000 0.0000 0.0400 0.0400 0.0000 0.0015 0.0007 0.0036 -0.0004 0.0025 0.0006 0.0033 3.7783 3.3468 3.8025 5.0361 4.6272 4.8044 3.5669 0.000 -0.029 0.487 0.828 0.325 0.137 1.000 1.000 0.396 0.396 0.545 0.550 -0.270 0.050
0.020 8.20 865.1 -1.219 4.6780 -1.4500 -0.0043 3.2100 0.0440 3.210 0.0070 1.0080 0.0000 -0.4600 0.0900 0.000 -0.2000 0.000 0.0000 0.0400 0.0400 0.0000 0.0015 0.0006 0.0036 -0.0005 0.0025 0.0005 0.0033 3.8281 3.4401 3.9053 5.1375 4.6958 4.8943 3.6425 0.000 -0.024 0.519 0.825 0.325 0.137 0.990 0.990 0.396 0.396 0.545 0.550 -0.270 0.050
0.030 8.20 907.8 -1.273 4.7730 -1.4500 -0.0044 3.2100 0.0440 3.210 0.0070 1.1270 0.0000 -0.4600 0.0900 0.000 -0.2000 0.000 0.0000 0.0400 0.0400 0.0000 0.0015 0.0006 0.0037 -0.0007 0.0025 0.0005 0.0034 3.8933 3.5087 4.0189 5.2699 4.7809 5.0028 3.7063 0.000 -0.034 0.543 0.834 0.325 0.137 0.990 0.990 0.396 0.396 0.545 0.550 -0.270 0.050
0.050 8.20 1053.5 -1.346 5.0290 -1.4500 -0.0046 3.2100 0.0440 3.210 0.0070 1.3330 0.0000 -0.4600 0.0900 0.000 -0.2000 0.000 0.0000 0.0400 0.0400 0.0000 0.0011 0.0006 0.0039 -0.0009 0.0026 0.0004 0.0036 4.2867 3.6553 4.2952 5.6157 5.0211 5.2819 3.9184 0.000 -0.061 0.435 0.895 0.325 0.137 0.970 0.985 0.396 0.467 0.644 0.560 -0.270 0.050
0.075 8.20 1085.7 -1.471 5.3340 -1.4500 -0.0047 3.2100 0.0440 3.210 0.0070 1.5650 0.0000 -0.4600 0.0900 0.000 -0.2000 0.000 0.0000 0.0600 0.0600 0.0000 0.0011 0.0004 0.0039 -0.0009 0.0026 0.0003 0.0037 4.5940 3.9799 4.5464 6.0204 5.3474 5.6123 4.2207 0.000 -0.076 0.410 0.863 0.325 0.137 0.950 0.980 0.396 0.516 0.713 0.580 -0.270 0.050
0.100 8.20 1032.5 -1.624 5.4550 -1.4500 -0.0048 3.2100 0.0440 3.210 0.0070 1.6790 0.0000 -0.4600 0.0900 0.000 -0.2000 0.000 0.0000 0.1000 0.1000 0.0000 0.0012 0.0003 0.0039 -0.0008 0.0026 0.0003 0.0038 4.7077 4.1312 4.6138 6.1625 5.5065 5.7668 4.3536 0.000 -0.049 0.397 0.842 0.325 0.137 0.920 0.970 0.396 0.516 0.713 0.590 -0.270 0.050
0.150 8.20 877.6 -1.931 5.3760 -1.4250 -0.0047 3.2100 0.0440 3.210 0.0070 1.8530 0.0000 -0.4600 0.0900 0.000 -0.1860 0.000 -0.0550 0.1350 0.1350 0.0690 0.0013 -0.0002 0.0037 -0.0009 0.0022 0.0001 0.0037 4.6065 4.2737 4.5290 5.9614 5.5180 5.7313 4.3664 0.000 -0.026 0.428 0.737 0.325 0.137 0.900 0.960 0.396 0.516 0.647 0.590 -0.270 0.050
0.200 8.20 748.2 -2.188 4.9360 -1.3350 -0.0045 3.2100 0.0430 3.210 0.0062 2.0220 0.0000 -0.4600 0.0840 0.000 -0.1500 0.000 -0.1050 0.1700 0.1700 0.1400 0.0013 -0.0007 0.0031 -0.0010 0.0018 -0.0001 0.0035 4.1866 3.9650 4.1656 5.3920 5.1668 5.2943 4.0169 0.000 -0.011 0.442 0.746 0.325 0.137 0.870 0.940 0.396 0.516 0.596 0.570 -0.270 0.050
0.250 8.20 654.3 -2.381 4.6360 -1.2750 -0.0043 3.2100 0.0420 3.210 0.0056 2.1810 0.0000 -0.4600 0.0800 0.000 -0.1400 0.000 -0.1340 0.1700 0.1700 0.1640 0.0013 -0.0009 0.0027 -0.0011 0.0016 -0.0003 0.0033 3.8515 3.6821 3.9147 5.0117 4.8744 5.0058 3.7590 0.101 -0.009 0.494 0.796 0.325 0.137 0.840 0.930 0.396 0.501 0.539 0.530 -0.224 0.043
0.300 8.20 587.1 -2.518 4.4230 -1.2310 -0.0042 3.2100 0.0410 3.210 0.0051 2.2810 -0.0020 -0.4600 0.0780 0.000 -0.1200 0.000 -0.1500 0.1700 0.1700 0.1900 0.0014 -0.0010 0.0020 -0.0009 0.0014 -0.0002 0.0032 3.5783 3.5415 3.7846 4.7057 4.6544 4.7588 3.5914 0.184 0.005 0.565 0.782 0.325 0.137 0.820 0.910 0.396 0.488 0.488 0.490 -0.186 0.037
0.400 8.20 503.0 -2.657 4.1240 -1.1650 -0.0040 3.2100 0.0400 3.210 0.0043 2.3790 -0.0070 -0.4700 0.0750 0.000 -0.1000 0.000 -0.1500 0.1700 0.1700 0.2060 0.0015 -0.0010 0.0013 -0.0007 0.0011 0.0000 0.0030 3.2493 3.3256 3.5702 4.2896 4.3660 4.3789 3.3704 0.315 0.040 0.625 0.768 0.325 0.137 0.740 0.860 0.396 0.468 0.468 0.425 -0.126 0.028
0.500 8.20 456.6 -2.669 3.8380 -1.1150 -0.0037 3.2100 0.0390 3.210 0.0037 2.3390 -0.0110 -0.4800 0.0720 0.000 -0.0800 0.000 -0.1500 0.1700 0.1700 0.2200 0.0015 -0.0011 0.0009 -0.0007 0.0008 0.0002 0.0027 2.9818 3.1334 3.3552 3.9322 4.0779 4.0394 3.1564 0.416 0.097 0.634 0.728 0.325 0.137 0.660 0.800 0.396 0.451 0.451 0.375 -0.079 0.022
0.600 8.20 430.3 -2.599 3.5620 -1.0710 -0.0035 3.2100 0.0380 3.210 0.0033 2.2170 -0.0150 -0.4900 0.0700 0.000 -0.0600 0.000 -0.1500 0.1700 0.1700 0.2250 0.0015 -0.0012 0.0006 -0.0007 0.0006 0.0002 0.0025 2.7784 2.9215 3.0922 3.6149 3.8146 3.7366 2.9584 0.499 0.145 0.581 0.701 0.325 0.137 0.590 0.780 0.396 0.438 0.438 0.345 -0.041 0.016
0.750 8.15 410.5 -2.401 3.1520 -1.0200 -0.0032 3.2100 0.0370 3.210 0.0027 1.9460 -0.0210 -0.5000 0.0670 0.000 -0.0470 0.000 -0.1500 0.1700 0.1700 0.2170 0.0014 -0.0011 0.0003 -0.0007 0.0004 0.0002 0.0022 2.4780 2.5380 2.6572 3.1785 3.4391 3.2930 2.6556 0.600 0.197 0.497 0.685 0.325 0.137 0.500 0.730 0.396 0.420 0.420 0.300 0.005 0.009
1.000 8.10 400.0 -1.955 2.5440 -0.9500 -0.0029 3.2100 0.0350 3.210 0.0019 1.4160 -0.0280 -0.5100 0.0630 0.000 -0.0350 0.000 -0.1500 0.1700 0.1700 0.1850 0.0013 -0.0008 0.0001 -0.0008 0.0002 0.0001 0.0019 1.9252 1.9626 2.1459 2.5722 2.8056 2.6475 2.0667 0.731 0.269 0.469 0.642 0.325 0.137 0.410 0.690 0.396 0.396 0.396 0.240 0.065 0.000
1.500 8.05 400.0 -1.025 1.6360 -0.8600 -0.0026 3.2100 0.0340 3.210 0.0008 0.3940 -0.0410 -0.5200 0.0590 0.000 -0.0180 0.000 -0.1300 0.1700 0.1700 0.0830 0.0014 -0.0004 -0.0001 -0.0008 0.0001 0.0000 0.0016 0.9924 1.3568 1.3499 1.6499 1.8546 1.6842 1.3316 0.748 0.347 0.509 0.325 0.312 0.113 0.330 0.620 0.379 0.379 0.379 0.230 0.065 0.000
2.000 8.00 400.0 -0.299 1.0760 -0.8200 -0.0024 3.2100 0.0320 3.210 0.0000 -0.4170 -0.0500 -0.5300 0.0590 0.000 -0.0100 0.000 -0.1100 0.1700 0.1700 0.0450 0.0015 0.0002 0.0000 -0.0007 0.0002 0.0000 0.0014 0.4676 0.8180 0.8148 1.0658 1.3020 1.1002 0.7607 0.761 0.384 0.478 0.257 0.302 0.096 0.300 0.560 0.366 0.366 0.366 0.230 0.065 0.000
2.500 7.95 400.0 0.000 0.6580 -0.7980 -0.0022 3.2100 0.0310 3.210 0.0000 -0.7250 -0.0570 -0.5400 0.0600 0.000 -0.0050 0.000 -0.0950 0.1700 0.1700 0.0260 0.0014 0.0004 0.0000 -0.0007 0.0002 -0.0002 0.0012 0.0579 0.4389 0.3979 0.6310 0.8017 0.6737 0.3648 0.770 0.397 0.492 0.211 0.295 0.082 0.270 0.520 0.356 0.356 0.356 0.230 0.065 0.000
3.000 7.90 400.0 0.000 0.4240 -0.7930 -0.0021 3.1300 0.0300 3.130 0.0000 -0.6950 -0.0650 -0.5400 0.0590 0.000 0.0000 0.000 -0.0850 0.1700 0.1700 0.0350 0.0014 0.0007 0.0003 -0.0007 0.0004 -0.0002 0.0011 -0.1391 0.1046 0.1046 0.3882 0.5958 0.4126 0.1688 0.778 0.404 0.470 0.296 0.289 0.072 0.250 0.495 0.348 0.348 0.348 0.240 0.065 0.000
4.000 7.85 400.0 0.000 0.0930 -0.7930 -0.0020 2.9850 0.0290 2.985 0.0000 -0.6380 -0.0770 -0.5400 0.0500 0.000 0.0000 0.000 -0.0730 0.1700 0.1700 0.0530 0.0014 0.0010 0.0007 -0.0006 0.0006 -0.0002 0.0010 -0.3030 -0.1597 -0.2324 0.0164 0.3522 0.0097 -0.0323 0.790 0.397 0.336 0.232 0.280 0.055 0.220 0.430 0.335 0.335 0.335 0.270 0.065 0.000
5.000 7.80 400.0 0.000 -0.1450 -0.7930 -0.0020 2.8180 0.0280 2.818 0.0000 -0.5970 -0.0880 -0.5400 0.0430 0.000 0.0000 0.000 -0.0650 0.1700 0.1700 0.0720 0.0014 0.0013 0.0014 -0.0004 0.0008 -0.0001 0.0010 -0.4094 -0.2063 -0.5722 -0.2802 0.1874 -0.2715 -0.1516 0.799 0.378 0.228 0.034 0.273 0.041 0.190 0.400 0.324 0.324 0.324 0.300 0.065 0.000
6.000 7.80 400.0 0.000 -0.3200 -0.7930 -0.0020 2.6820 0.0270 2.682 0.0000 -0.5610 -0.0980 -0.5400 0.0380 0.000 0.0000 0.000 -0.0600 0.1700 0.1700 0.0860 0.0014 0.0015 0.0015 -0.0003 0.0011 0.0000 0.0010 -0.5010 -0.3223 -0.8631 -0.4822 -0.1243 -0.4591 -0.2217 0.807 0.358 0.151 -0.037 0.267 0.030 0.170 0.370 0.314 0.314 0.314 0.320 0.065 0.000
7.500 7.80 400.0 0.000 -0.5560 -0.7930 -0.0020 2.5150 0.0260 2.515 0.0000 -0.5300 -0.1100 -0.5400 0.0320 0.000 0.0000 0.000 -0.0550 0.1700 0.1700 0.1150 0.0014 0.0017 0.0015 -0.0002 0.0014 0.0001 0.0010 -0.6209 -0.4223 -1.1773 -0.7566 -0.3316 -0.6822 -0.3338 0.817 0.333 0.051 -0.178 0.259 0.017 0.140 0.320 0.301 0.301 0.301 0.350 0.065 0.000
10.00 7.80 400.0 0.000 -0.8600 -0.7930 -0.0020 2.3000 0.0250 2.300 0.0000 -0.4860 -0.1270 -0.5400 0.0240 0.000 0.0000 0.000 -0.0450 0.1700 0.1700 0.1510 0.0014 0.0017 0.0015 -0.0001 0.0017 0.0002 0.0010 -0.6221 -0.5909 -1.4070 -1.0870 -0.6783 -0.9173 -0.5441 0.829 0.281 -0.251 -0.313 0.250 0.000 0.100 0.280 0.286 0.286 0.286 0.350 0.065 0.000
""")
[docs]class AbrahamsonGulerce2020SSlab(AbrahamsonGulerce2020SInter):
"""
Implements the 2020 Subduction ground motion model of Abrahamson &
Gulerce (2020) for subduction in-slab earthquakes
Abrahamson N. and Gulurce Z. (2020) "Regionalized Ground-Motion Models
for Subduction Earthquakes based on the NGA-SUB Database", Pacific
Earthquake Engineering Research Center (PEER) Technical Report,
PEER 2020/25
"""
#: Required rupture parameters are magnitude and top-of-rupture depth
REQUIRES_RUPTURE_PARAMETERS = {'mag', 'ztor'}
#: Supported tectonic region type is subduction inslab
DEFINED_FOR_TECTONIC_REGION_TYPE = const.TRT.SUBDUCTION_INTRASLAB
# Long form regional aliases
REGION_ALIASES = {
"GLO": "",
"USA-AK": "Alaska",
"CAS": "Cascadia",
"CAM": "CentralAmericaMexico",
"JPN": "Japan",
"NZL": "NewZealand",
"SAM": "SouthAmerica",
"TWN": "Taiwan",
}
for region in SUPPORTED_REGIONS[1:]:
add_alias("AbrahamsonGulerce2020SInter" + REGION_ALIASES[region],
AbrahamsonGulerce2020SInter,
region=region)
add_alias("AbrahamsonGulerce2020SSlab" + REGION_ALIASES[region],
AbrahamsonGulerce2020SSlab,
region=region)