Source code for pygmm.derras_bard_cotton_2014

"""Derras, Bard and Cotton (2014, :cite:`derras14`) model."""

import json
import os

import numpy as np

from . import model

__author__ = "Albert Kottke"


[docs] class DerrasBardCotton2014(model.GroundMotionModel): """Derras, Bard and Cotton (2014, :cite:`derras14`) model. Parameters ---------- scenario : :class:`pygmm.model.Scenario` earthquake scenario """ NAME = "Derras, Bard & Cotton (2014)" ABBREV = "DBC13" # Load the coefficients for the model COEFF = json.load( open( os.path.join( os.path.dirname(__file__), "data", "derras_bard_cotton_2014.json" ) ) ) GRAVITY = 9.80665 PERIODS = np.array(COEFF["period"]) INDICES_PSA = np.arange(2, 64) INDEX_PGA = 1 INDEX_PGV = 0 PARAMS = [ model.NumericParameter("dist_jb", True, 5, 200), model.NumericParameter("mag", True, 4, 7), model.NumericParameter("v_s30", True, 200, 800), model.NumericParameter("depth_hyp", True, 0, 25), model.CategoricalParameter("mechanism", True, ["SS", "NS", "RS"]), ]
[docs] def __init__(self, scenario: model.Scenario): """Initialize the model.""" super().__init__(scenario) c = self.COEFF # Values modified during the calculation s = dict(self._scenario) for k in ["v_s30", "dist_jb"]: s["log10_" + k] = np.log10(s[k]) # Translate to mechanism integer s["mechanism"] = dict(NS=1, RS=3, SS=4)[s["mechanism"]] # Create the normalized parameter matrix keys = ["log10_dist_jb", "mag", "log10_v_s30", "depth_hyp", "mechanism"] values = np.array([s[k] for k in keys]) limits = np.rec.array([c["min_max"][k] for k in keys], names="min,max") p_n = np.array( 2 * (values - limits["min"]) / (limits["max"] - limits["min"]) - 1 ).T # Compute the normalized response b_1 = np.array(c["b_1"]).T b_2 = np.array(c["b_2"]).T w_1 = np.array(c["w_1"]) w_2 = np.array(c["w_2"]) log10_resp_n = b_2 + w_2 @ np.tanh(b_1 + w_1 @ p_n) # Convert from normalized values log10_resp_limits = np.rec.array(c["min_max"]["log10_resp"], names="min,max") log10_resp = ( 0.5 * (log10_resp_n + 1) * (log10_resp_limits["max"] - log10_resp_limits["min"]) + log10_resp_limits["min"] ) # Convert from m/sec and m/sec² into cm/sec and g scale = np.log10(np.r_[0.01, self.GRAVITY * np.ones(self.PERIODS.size - 1)]) self._ln_resp = np.log(10 ** (log10_resp - scale)) self._ln_std = np.log(10 ** np.array(c["log10_std"]["total"]))