Source code for openquake.hazardlib.gsim.idini_2017

# -*- 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:`IdiniEtAl2017SInter`
               :class:`IdiniEtAl2017SSlab`
"""
import numpy as np

from openquake.baselib.general import CallableDict
from openquake.hazardlib import const
from openquake.hazardlib.gsim.base import GMPE, CoeffsTable
from openquake.hazardlib.imt import PGA, SA

CONSTS = {'Mr': 5,
          'Vref': 1530,
          'c4': 0.1,
          'c6': 5,
          'c7': 0.35,
          'h0': 50}

_get_distance_term = CallableDict()


@_get_distance_term.add(const.TRT.SUBDUCTION_INTERFACE)
def _get_distance_term_1(trt, C, ctx):
    """
    Returns the magnitude dependent distance scaling term defined in
    Equation (5)
    """
    mag = ctx.mag
    R = np.where(mag < 7.7, ctx.rhypo, ctx.rrup)
    g = C['c3'] + CONSTS['c4'] * (mag - CONSTS['Mr'])
    Ro = CONSTS['c6'] * 10 ** (CONSTS['c7'] * (mag - CONSTS['Mr']))
    return g * np.log10(R + Ro) + C['c5'] * R


@_get_distance_term.add(const.TRT.SUBDUCTION_INTRASLAB)
def _get_distance_term_2(trt, C, ctx):
    """
    Returns the magnitude dependent distance scaling term defined in
    Equation (5)
    """
    mag = ctx.mag
    R = ctx.rhypo
    g = C['c3'] + CONSTS['c4'] * (mag - CONSTS['Mr']) + C['dc3']
    return g * np.log10(R) + C['c5'] * R


_get_magnitude_term = CallableDict()


@_get_magnitude_term.add(const.TRT.SUBDUCTION_INTERFACE)
def _get_magnitude_term_1(trt, C, ctx):
    """
    Returns the magnitude scaling term defined in Equation (3)
    """
    return C['c1'] + C['c2'] * ctx.mag + C['c9'] * ctx.mag ** 2.0


@_get_magnitude_term.add(const.TRT.SUBDUCTION_INTRASLAB)
def _get_magnitude_term_2(trt, C, ctx):
    """
    Returns the magnitude scaling term defined in Equation (3)
    """
    mag = ctx.mag
    H = ctx.hypo_depth
    return C['c1'] + C['c2'] * mag + C['c8'] * (H - CONSTS['h0']) + \
        C['dc1'] + C['dc2'] * mag


def _get_site_term(C, ctx):
    """
    Returns the site scaling term defined in Equation (18)
    """
    soiltype = ctx.soiltype
    vs30 = ctx.vs30

    # sT* depends on the soil type.
    # If soiltype > 6, use soiltype = 1 (rock)
    sT = [C['s%i' % st] if st > 1 and st <= 6 else 0 for st in soiltype]

    return sT * np.log10(vs30 / CONSTS['Vref'])


def _get_stddevs(C):
    """
    Returns the standard deviations
    """
    # sigma_e and sigma_r are in log10 base, so we need to transform them
    tau = np.log(10 ** C['sigma_e'])
    phi = np.log(10 ** C['sigma_r'])
    return [np.sqrt(tau ** 2.0 + phi ** 2.0), tau, phi]


[docs]class IdiniEtAl2017SInter(GMPE): """ Implements the GMPE developed by Idini et al. (2017) for subduction interface earthquakes, publised as: Idini, B., F. Rojas, S. Ruiz, and C. Pastén. 2017. “Ground motion prediction equations for the Chilean subduction zone.” Bull. Earthq. Eng. 15(5): 1853–1880. """ #: 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 the geometric mean component DEFINED_FOR_INTENSITY_MEASURE_COMPONENT = const.IMC.GEOMETRIC_MEAN #: Supported standard deviation types are inter-event, intra-event #: and total DEFINED_FOR_STANDARD_DEVIATION_TYPES = { const.StdDev.TOTAL, const.StdDev.INTER_EVENT, const.StdDev.INTRA_EVENT} #: Site amplification is dependent on the Site Class and Vs30 REQUIRES_SITES_PARAMETERS = {'soiltype', '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 M>=7.7, and hypocentral distance for interface events #: M<7.7 REQUIRES_DISTANCES = {'rrup', 'rhypo'}
[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 for m, imt in enumerate(imts): C = self.COEFFS[imt] mean[m] = (_get_magnitude_term(trt, C, ctx) + _get_distance_term(trt, C, ctx) + _get_site_term(C, ctx)) # Convert from log10 to ln mean[m] = np.log(10 ** mean[m]) sig[m], tau[m], phi[m] = _get_stddevs(C)
COEFFS = CoeffsTable(sa_damping=5, table="""\ imt c1 c2 c9 c8 dc1 dc2 sigma_e sigma_t c3 c5 dc3 sigma_r s2 s3 s4 s5 s6 pga -2.85480 0.77410 -0.039580 0.005860 2.56990 -0.47610 0.1720 0.2890 -0.975580 -0.001740 -0.527450 0.2320 -0.5840 -0.3220 -0.1090 -0.0950 -0.2120 0.01 -2.84240 0.80520 -0.041350 0.005840 2.73700 -0.51910 0.1730 0.2880 -1.029930 -0.001750 -0.504660 0.2310 -0.5230 -0.2620 -0.1000 -0.0920 -0.1930 0.02 -2.83370 0.83830 -0.043250 0.005830 2.90870 -0.56400 0.1760 0.2920 -1.085670 -0.001760 -0.480430 0.2330 -0.4590 -0.2080 -0.0920 -0.0890 -0.1770 0.03 -2.82350 0.88380 -0.045950 0.005860 3.07350 -0.62270 0.1780 0.2950 -1.159510 -0.001760 -0.424900 0.2350 -0.3900 -0.1600 -0.0850 -0.0880 -0.1640 0.05 -2.73580 0.95390 -0.050330 0.006210 3.21470 -0.70790 0.1900 0.3070 -1.286400 -0.001780 -0.312390 0.2410 -0.3060 -0.0880 -0.0750 -0.0900 -0.1460 0.07 -2.60040 0.98080 -0.052250 0.006030 3.08510 -0.74250 0.2130 0.3290 -1.346440 -0.001810 -0.179950 0.2510 -0.3510 -0.0560 -0.0690 -0.0960 -0.1410 0.10 -2.48910 0.95440 -0.050600 0.005710 2.80910 -0.70550 0.1950 0.3210 -1.323530 -0.001820 -0.132080 0.2550 -0.5240 -0.0870 -0.0700 -0.1130 -0.1560 0.15 -2.65050 0.92320 -0.048790 0.005600 2.62600 -0.62700 0.1600 0.3020 -1.176870 -0.001830 -0.264510 0.2550 -0.6910 -0.3360 -0.0950 -0.1660 -0.2450 0.20 -3.00960 0.94260 -0.050340 0.005730 2.60630 -0.59760 0.1570 0.3100 -1.045080 -0.001820 -0.391050 0.2680 -0.6710 -0.5470 -0.1270 -0.2090 -0.3590 0.25 -3.33210 0.95780 -0.051430 0.005070 2.36540 -0.58200 0.1420 0.2990 -0.943630 -0.001780 -0.343480 0.2640 -0.5840 -0.6740 -0.1780 -0.2350 -0.4440 0.30 -3.54220 0.94410 -0.050520 0.004280 2.20170 -0.54120 0.1410 0.2960 -0.848140 -0.001730 -0.366950 0.2600 -0.5060 -0.7300 -0.2580 -0.2340 -0.4910 0.40 -3.39850 0.77730 -0.038850 0.003080 1.63670 -0.34480 0.1570 0.3060 -0.692780 -0.001660 -0.463010 0.2630 -0.3860 -0.7180 -0.4230 -0.1640 -0.5350 0.50 -2.80410 0.50690 -0.019730 0.002570 0.76210 -0.06170 0.1520 0.3020 -0.578990 -0.001610 -0.540980 0.2610 -0.3000 -0.6350 -0.5370 -0.1100 -0.5570 0.75 -4.45880 0.86910 -0.041790 0.001350 2.10030 -0.43490 0.1460 0.2910 -0.568870 -0.001580 -0.462660 0.2520 -0.2760 -0.3950 -0.5750 -0.3580 -0.5990 1.00 -5.33910 1.01670 -0.049990 0.000450 2.56100 -0.56780 0.1530 0.2900 -0.532820 -0.001540 -0.423140 0.2470 -0.2750 -0.2540 -0.4620 -0.6700 -0.5840 1.50 -6.12040 1.10050 -0.054260 0.000680 2.89230 -0.58980 0.1520 0.2890 -0.462630 -0.001450 -0.585190 0.2460 -0.2490 -0.2380 -0.3000 -0.8010 -0.5220 2.00 -7.03340 1.25010 -0.063560 0.000510 3.39410 -0.70090 0.1570 0.2910 -0.405940 -0.001390 -0.659990 0.2450 -0.2180 -0.2310 -0.2200 -0.7460 -0.4790 3.00 -8.25070 1.46520 -0.077970 0.000660 4.00330 -0.84650 0.1550 0.2790 -0.339570 -0.001370 -0.790040 0.2310 -0.1800 -0.2190 -0.2100 -0.6280 -0.4610 4.00 -8.74330 1.48270 -0.078630 0.000630 3.93370 -0.81340 0.1600 0.2790 -0.264790 -0.001370 -0.865450 0.2280 -0.1710 -0.2180 -0.2120 -0.5310 -0.4480 5.00 -8.99270 1.46300 -0.076380 0.000670 3.75760 -0.76420 0.1670 0.2860 -0.223330 -0.001370 -0.887350 0.2320 -0.1680 -0.2180 -0.2030 -0.4380 -0.4390 7.50 -9.82450 1.63830 -0.086200 0.001080 4.39480 -0.93130 0.1640 0.2830 -0.303460 -0.001310 -0.912590 0.2310 -0.1680 -0.2180 -0.1530 -0.2560 -0.4350 10.00 -9.86710 1.58770 -0.081680 0.000140 4.38750 -0.88920 0.1760 0.2700 -0.337710 -0.001170 -0.963630 0.2040 -0.1680 -0.2180 -0.1250 -0.2310 -0.4350 """)
[docs]class IdiniEtAl2017SSlab(IdiniEtAl2017SInter): """ Implements the GMPE developed by Idini et al. (2017) for subduction inslab (intraslab) earthquakes, publised as: Idini, B., F. Rojas, S. Ruiz, and C. Pastén. 2017. “Ground motion prediction equations for the Chilean subduction zone.” Bull. Earthq. Eng. 15(5): 1853–1880. """ #: Supported tectonic region type is subduction in-slab DEFINED_FOR_TECTONIC_REGION_TYPE = const.TRT.SUBDUCTION_INTRASLAB #: Required rupture parameters for the in-slab model are magnitude and top # of rupture depth REQUIRES_RUPTURE_PARAMETERS = {'mag', 'hypo_depth'}