Source code for openquake.hazardlib.gsim.morikawa_fujiwara_2013

# -*- coding: utf-8 -*-
# vim: tabstop=4 shiftwidth=4 softtabstop=4
#
# Copyright (C) 2021 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:`MorikawaFujiwara2013Crustal`,
:class:`MorikawaFujiwara2013CrustalNIED`,
:class:`MorikawaFujiwara2013SubInterface`,
:class:`MorikawaFujiwara2013SubInterfaceNE`,
:class:`MorikawaFujiwara2013SubInterfaceSW`,
:class:`MorikawaFujiwara2013SubInterfaceNIED`,
:class:`MorikawaFujiwara2013SubInterfaceNENIED`,
:class:`MorikawaFujiwara2013SubInterfaceSWNIED`,
:class:`MorikawaFujiwara2013SubSlab`,
:class:`MorikawaFujiwara2013SubSlabNE`,
:class:`MorikawaFujiwara2013SubSlabSW`,
:class:`MorikawaFujiwara2013SubSlabNIED`,
:class:`MorikawaFujiwara2013SubSlabNENIED`,
:class:`MorikawaFujiwara2013SubSlabSWNIED`.
"""
import numpy as np

from openquake.baselib.general import CallableDict
from openquake.hazardlib.gsim.base import GMPE, CoeffsTable
from openquake.hazardlib import const
from openquake.hazardlib.geo import Point, Polygon
from openquake.hazardlib.geo.mesh import Mesh
from openquake.hazardlib.imt import PGA, PGV, SA, JMA
from openquake.hazardlib.gsim.si_midorikawa_1999 import (
    set_mean as _sm1999_set_mean, _get_min_distance_to_volcanic_front)


CONSTS = {
    "D0": 300.,
    "e": 0.5,
    "Mw01": 8.2,
    "Mw1": 16.0}

# Volcanic front traces provided by NIED
VOLC_FRONT_PAC_LATS = np.array([
    24.0, 31.0, 34.1, 36.1, 37.2, 39.3, 42.6, 43.6, 44.3, 45.9])
VOLC_FRONT_PAC_LONS = np.array([
    141.6, 140.2, 139.7, 138.7, 140.1, 141.0, 141.2, 145.0, 146.9, 150.0])
VOLC_FRONT_PHI_LATS = np.array([
    24.5, 24.5, 27.9, 29.5, 31.5, 33.4, 34.9, 35.3, 35.3, 36.2, 36.2])
VOLC_FRONT_PHI_LONS = np.array([
    122.0, 124.0, 128.3, 129.7, 130.8, 131.6, 132.0, 133.7, 134.9,
    136.9, 138.7])

# Philippine Sea plate subduction zone boundaries
PSE_CPHL_03_LONS = np.array([
    132.5830, 132.8830, 132.9000, 132.9000, 132.4830, 132.3000,
    132.1330, 131.2830, 131.5170, 131.7670, 132.1830, 132.3170])
PSE_CPHL_03_LATS = np.array([
    34.3000, 34.4170, 33.8000, 33.5170, 33.2000, 33.0000,
    33.2170, 33.2670, 33.6830, 34.0170, 33.9670, 34.1000])

PSE_CPHL_04_LONS = np.array([
    132.1330, 131.9170, 131.7000, 131.5170, 131.4830, 131.0830,
    130.9000, 130.3000, 130.0000, 130.4000, 130.6000, 131.0000, 131.2830])
PSE_CPHL_04_LATS = np.array([
    33.2170, 32.9330, 32.5330, 32.0170, 31.7830, 31.0670,
    30.8170, 31.0500, 31.2670, 32.0000, 32.3670, 32.6500, 33.2670])

PSE_CPHL_05_LONS = np.array([
    130.3000, 130.9000, 130.4670, 130.0670, 129.6000, 129.2000,
    128.8000, 127.7670, 126.8170, 126.2670, 125.3000, 125.0000,
    124.5000, 123.7000, 123.0000, 122.5000, 122.2330, 121.5000,
    122.2330, 123.0000, 124.0000, 125.0000, 126.0000, 127.0000,
    128.0000, 129.0000, 130.0000])
PSE_CPHL_05_LATS = np.array([
    31.0500, 30.8170, 30.2500, 29.8000, 29.2330, 28.6000,
    28.1000, 27.1000, 26.1000, 25.6000, 24.9670, 24.8500,
    24.7170, 24.6330, 24.5330, 24.5500, 24.5500, 24.5500,
    25.3330, 25.5000, 25.7670, 26.5000, 27.2670, 28.0000,
    28.8170, 30.0000, 31.2670])

# Make a list of pgns representing the PHP slab boundaries
PHP_PGNS = {
    "zone_03": Polygon([Point(lo, la) for lo, la in zip(
        PSE_CPHL_03_LONS, PSE_CPHL_03_LATS)]),
    "zone_04": Polygon([Point(lo, la) for lo, la in zip(
        PSE_CPHL_04_LONS, PSE_CPHL_04_LATS)]),
    "zone_05": Polygon([Point(lo, la) for lo, la in zip(
        PSE_CPHL_05_LONS, PSE_CPHL_05_LATS)]),
}


### NIED sigma model functions ###
def _get_nied_sigma_crustal(rrup):
    """
    Distance-dependent total sigma in log10 units for shallow
    crustal earthquakes as described in equation 7 of:

    https://www.j-shis.bosai.go.jp/en/labs/mf2013/

    The distance type used is rupture dist
    """
    # Select distance dependent sigma
    return np.piecewise(
        rrup.astype(float),
        [rrup <= 20., (rrup > 20.) & (rrup <= 30.)],
        [0.23,                                                  # rrup <= 20
         lambda x:
         0.23 - 0.03 * np.log10(x / 20.) / np.log10(30. / 20.), # 20 < rrup <= 30
         0.20]                                                  # rrup > 30
    )


def _get_nied_sigma_subduction(ctx, d_pgv):
    """
    Amplitude-dependent total sigma in log10 units for subduction
    earthquakes as described in equation 8 of:
    
    https://www.j-shis.bosai.go.jp/en/labs/mf2013/
    
    PGV at Vs30=600 m/s is required here and obtained from Si and
    Midorikawa (1999). NOTE: Given we need PGV for Vs30 of 600 m/s
    the _apply_amplification_factor part of SM99's compute method
    is intentionally skipped here (it's not needed).

    d_pgv: coefficient for PGV in Si & Midorikawa (1999) which is
           -0.02 for interface and 0.12 for intraslab
    
    """
    # Get the PGA for vs30 of 600 m/s in SM99
    pgv_log10 = np.zeros(len(ctx.rrup))
    _sm1999_set_mean(
        PGV(), ctx.mag, ctx.hypo_depth, ctx.rrup, d_pgv, pgv_log10
        )
    pgv = 10. ** pgv_log10  # From log 10 into linear (cm/s)

    # Now select based on the PGV in linear space
    return np.piecewise(
        pgv,
        [pgv <= 25., (pgv > 25.) & (pgv <= 50.)],
        [0.20,                                    # PGV <= 25
         lambda x: 0.20 - 0.05 * (x - 25.) / 25., # 25 < PGV <= 50
         0.15]                                    # PGV > 50
    )


def _apply_nied_sigma(imts, sig, sigma_log10):
    """
    Assign the NIED sigma which is supplied in log10 and
    apply the same unit conversion used in the underlying
    compute method
    """
    for m, imt in enumerate(imts):
        if imt.name == 'JMA':
            sig[m] = 2 * sigma_log10
        else:
            sig[m] = sigma_log10 * np.log(10)


### Original GMM ###
def _get_basin_term(C, ctx, region=None):
    d0 = CONSTS["D0"]
    tmp = np.ones_like(ctx.z1pt4) * C['Dlmin']
    return C['pd'] * np.log10(np.maximum(tmp, ctx.z1pt4) / d0)


def _anomalous_intensity_correction_term(C, region, ctx, trt, php_nshm):
    """
    Anomalous intensity correction (equation 11).

    We compute xvf by a ctx by ctx basis because we want to use a
    different volcanic front depending on the region parameter.

    NOTE: When php_nshm is non-empty (NIED subclasses):
        - NE correction is tapered linearly from zero at 35.5 deg north
          to full (unity) at 36.5 deg north.
        - SW correction is restricted to sites west of 136.9 deg east.
        - For slab earthquakes do not apply if the event is located in
          zones 4 or 5 of the Philippine plate as defined in the NSHM.
    """
    # No region so apply no anomalous intensity correction
    if region is None:
        return 0.

    # Select volc front geometry to compute xvf with
    if region == "NE":  # Associate NE with Pacific volc front
        vf_lat, vf_lon = VOLC_FRONT_PAC_LATS, VOLC_FRONT_PAC_LONS
    else:  # Associate SW with Philippine volc front
        vf_lat, vf_lon = VOLC_FRONT_PHI_LATS, VOLC_FRONT_PHI_LONS

    # Get xvf
    xvf = _get_min_distance_to_volcanic_front(ctx.lon, ctx.lat, vf_lon, vf_lat)

    if region == 'NE':
        gamma = C['gNE']
        corr = gamma * xvf * np.maximum(ctx.hypo_depth - 30., 0.)
        if php_nshm:
            # Only apply in the NIED subclasses (2025 NSHM)
            taper = np.clip((ctx.lat - 35.5) / 1.0, 0.0, 1.0)
            corr = corr * taper
        return corr
    
    elif region == 'SW': # Clip xvf and only apply to >= 60 km events
        gamma = C['gSW']
        xvf_filt = np.minimum(xvf, 75.0)
        corr = gamma * xvf_filt * np.maximum(ctx.hypo_depth - 30., 0.)
        # Only apply for events >= 60 km
        mask = ctx.hypo_depth < 60 # NB events shallow are EXCLUDED in the mask
        if php_nshm:
            # In NIED subclasses also restrict to sites west of 136.9 deg east
            mask = mask | (ctx.lon >= 136.9)
            # In the NIED case we also only apply SW correction if an
            # inslab event is INSIDE zone 4 or zone 5 of the PHP slab
            if trt == const.TRT.SUBDUCTION_INTRASLAB:
                mask = mask | ~(php_nshm['zone_04'] | php_nshm['zone_05'])

        # Apply corr only for events with depth greater than or equal to
        # 60 km AND if the NIED NSHM version also only those slab events in
        # zones 4 or 5 AND only at sites west of 136.9 deg east 
        corr[mask] = 0.

        return corr
    
    else:
        raise ValueError('Unsupported region')


_get_magnitude_term = CallableDict()


@_get_magnitude_term.add(const.TRT.ACTIVE_SHALLOW_CRUST)
def _get_magnitude_term_1(trt, region, C, rrup, mw1prime, mw1, hypo_z,
                          php_nshm):
    return (C['a'] * (mw1prime - mw1)**2 + C['b1'] * rrup + C['c1'] -
            np.log10(rrup + C['d'] * 10.**(CONSTS['e'] * mw1prime)))


@_get_magnitude_term.add(const.TRT.SUBDUCTION_INTERFACE)
def _get_magnitude_term_2(trt, region, C, rrup, mw1prime, mw1, hypo_z,
                          php_nshm):
    return (C['a'] * (mw1prime - mw1)**2 + C['b2'] * rrup + C['c2'] -
            np.log10(rrup + C['d'] * 10.**(CONSTS['e']*mw1prime)))


@_get_magnitude_term.add(const.TRT.SUBDUCTION_INTRASLAB)
def _get_magnitude_term_3(trt, region, C, rrup, mw1prime, mw1, hypo_z,
                          php_nshm):
    tmp = (C['a'] * (mw1prime - mw1)**2 + C['b3'] * rrup + C['c3'] -
           np.log10(rrup + C['d'] * 10.**(CONSTS['e']*mw1prime)))
    
    if region != "SW":
        # Cannot be a PHP earthquake so end here
        return tmp
    
    # Must be SW (i.e., PHP) so apply additional PHP corr
    apply_ph = hypo_z < 80 # Only apply to shallower events
    if php_nshm:
        # Suppress PH adjustment for events inside PHP zones 4 or 5
        in_php = (php_nshm['zone_04'] | php_nshm['zone_05'])
        apply_ph = apply_ph & ~in_php

    tmp[apply_ph] += C['PH']

    return tmp


def _get_shallow_amplification_term(C, vs30):
    tmp = np.ones_like(vs30) * C['Vsmax']
    return C['ps'] * np.log10(np.minimum(tmp, vs30)/C['V0'])


[docs]class MorikawaFujiwara2013Crustal(GMPE): """ Implements the GMMs from Morikawa and Fujiwara published as "A New Ground Motion Prediction Equation for Japan Applicable up to M9 Mega-Earthquake", Journal of Disaster Research, Vol.8, No.5, 2013. """ #: Supported tectonic region type is active shallow crust DEFINED_FOR_TECTONIC_REGION_TYPE = const.TRT.ACTIVE_SHALLOW_CRUST #: Supported intensity measure types are spectral acceleration, #: peak ground velocity, peak ground acceleration and modified #: Mercalli intensity DEFINED_FOR_INTENSITY_MEASURE_TYPES = {PGA, PGV, SA, JMA} #: Supported intensity measure component is geometric mean DEFINED_FOR_INTENSITY_MEASURE_COMPONENT = const.IMC.GEOMETRIC_MEAN #: Supported standard deviation type is only total DEFINED_FOR_STANDARD_DEVIATION_TYPES = {const.StdDev.TOTAL} #: Required site parameters are: #: - Vs30 - time averaged shear-wave velocity [m/s] #: - z1p4 - Depth to the 1.4 km/s interface [m] #: - lon - Site longitude (for xvf computation) #: - lat - Site latitude (for xvf computation) REQUIRES_SITES_PARAMETERS = {'vs30', 'z1pt4', 'lon', 'lat'} #: Required rupture parameters are magnitude, and hypocentral depth [km]. REQUIRES_RUPTURE_PARAMETERS = {'mag', 'hypo_depth'} #: Required distance measure is Rrup [km] REQUIRES_DISTANCES = {'rrup'} # Use the anomalous intensity correction as defined in original paper nshm25_nied = False
[docs] def compute(self, ctx: np.recarray, imts, mean, sig, tau, phi): trt = self.DEFINED_FOR_TECTONIC_REGION_TYPE mw01 = CONSTS["Mw01"] mw1 = CONSTS["Mw1"] mw1prime = np.array(ctx.mag) mw1prime[ctx.mag >= mw01] = mw01 self.region = getattr(self, 'region', None) # PHP zone masks are only needed for the NIED NSHM subclasses if self.nshm25_nied and trt == const.TRT.SUBDUCTION_INTRASLAB: hypo_mesh = Mesh(ctx.hypo_lon, ctx.hypo_lat) php_nshm = {key: pgn.intersects(hypo_mesh) for key, pgn in PHP_PGNS.items()} else: php_nshm = {} for m, imt in enumerate(imts): C = self.COEFFS[imt] mean[m] = ( _get_magnitude_term(trt, self.region, C,ctx.rrup, mw1prime, mw1, ctx.hypo_depth, php_nshm) + _get_basin_term(C, ctx) + _get_shallow_amplification_term(C, ctx.vs30) + _anomalous_intensity_correction_term( C, self.region, ctx, trt, php_nshm)) if imt.name in ["PGA", "SA"]: mean[m] = np.log( 10**mean[m] / 980.665) # log10 of cm/^2 to ln of g elif imt.name == "PGV": mean[m] = np.log(10**mean[m]) # log10 of cm/s to ln of cm/s else: assert imt.name == "JMA" mean[m] = 2 * mean[m] # Eq 2 states we initially compute JMA/2 if imt.name == "JMA": sig[m] = 2 * C['sigma'] # Already in JMA units but still JMA/2 else: sig[m] = C['sigma'] * np.log(10) # log10 to ln
COEFFS = CoeffsTable(sa_damping=5, table="""\ IMT a b1 b2 b3 c1 c2 c3 d pd Dlmin ps Vsmax V0 gNE gSW PH sigma jma -0.0321 -0.003736 -0.003320 -0.004195 6.9301 6.9042 7.2975 0.005078 0.032214 320.0 -0.756496 1200.0 350 0.000061 0.000059 -0.2284 0.3493 pga -0.0321 -0.005315 -0.005042 -0.005605 7.0830 7.1181 7.5035 0.011641 -0.055358 15.0 -0.523212 1950.0 350 0.000076 0.000063 -0.2426 0.3761 pgv -0.0325 -0.002654 -0.002408 -0.003451 5.6952 5.6026 6.0030 0.002266 0.129142 105.0 -0.693402 850.0 350 0.000047 0.000037 -0.2643 0.3399 0.05 -0.0321 -0.005912 -0.005674 -0.006231 7.2151 7.2759 7.6801 0.012812 -0.071415 15.0 -0.368827 2000.0 350 0.000088 0.000066 -0.2414 0.3938 0.06 -0.0321 -0.006097 -0.005864 -0.006405 7.2852 7.3523 7.7504 0.014508 -0.081796 15.0 -0.309232 2000.0 350 0.000087 0.000066 -0.2427 0.4039 0.07 -0.0321 -0.006142 -0.005967 -0.006507 7.3397 7.4152 7.8127 0.015574 -0.089891 15.0 -0.247786 2000.0 350 0.000086 0.000066 -0.2439 0.4149 0.08 -0.0323 -0.006104 -0.006033 -0.006594 7.4122 7.4929 7.8938 0.016465 -0.093581 15.0 -0.234067 2000.0 350 0.000085 0.000066 -0.2451 0.4219 0.09 -0.0325 -0.006112 -0.006079 -0.006689 7.4817 7.5649 7.9649 0.017390 -0.089604 15.0 -0.252853 2000.0 350 0.000084 0.000066 -0.2461 0.4259 0.1 -0.0327 -0.006116 -0.006061 -0.006686 7.5396 7.6214 8.0219 0.018438 -0.084855 15.0 -0.284416 2000.0 350 0.000084 0.000066 -0.2470 0.4266 0.11 -0.0324 -0.005998 -0.005971 -0.006576 7.5072 7.5947 7.9960 0.017396 -0.076412 15.0 -0.305700 2000.0 350 0.000083 0.000066 -0.2479 0.4256 0.12 -0.0322 -0.005896 -0.005878 -0.006448 7.4920 7.5837 7.9782 0.016457 -0.076948 15.0 -0.351975 2000.0 350 0.000083 0.000066 -0.2486 0.4243 0.13 -0.0321 -0.005786 -0.005757 -0.006331 7.4788 7.5645 7.9644 0.015607 -0.072886 15.0 -0.395130 2000.0 350 0.000082 0.000066 -0.2494 0.4229 0.15 -0.0321 -0.005564 -0.005579 -0.006078 7.4630 7.5471 7.9360 0.014118 -0.061401 15.0 -0.461774 2000.0 350 0.000082 0.000066 -0.2506 0.4193 0.17 -0.0321 -0.005398 -0.005382 -0.005813 7.4557 7.5245 7.9097 0.012855 -0.051288 15.0 -0.536789 2000.0 350 0.000081 0.000066 -0.2516 0.4162 0.2 -0.0321 -0.005151 -0.005027 -0.005476 7.4307 7.4788 7.8719 0.011273 -0.043392 15.0 -0.633661 2000.0 350 0.000080 0.000065 -0.2528 0.4152 0.22 -0.0322 -0.005000 -0.004827 -0.005204 7.4139 7.4461 7.8311 0.010380 -0.035431 15.0 -0.665914 2000.0 350 0.000080 0.000065 -0.2535 0.4130 0.25 -0.0321 -0.004836 -0.004519 -0.004907 7.3736 7.3728 7.7521 0.009225 -0.032667 15.0 -0.719524 2000.0 350 0.000079 0.000065 -0.2543 0.4089 0.3 -0.0321 -0.004543 -0.004095 -0.004621 7.2924 7.2797 7.6656 0.007670 -0.019984 15.0 -0.793002 2000.0 350 0.000078 0.000065 -0.2553 0.4063 0.35 -0.0321 -0.004379 -0.003717 -0.004305 7.2417 7.1832 7.5796 0.006448 -0.010959 15.0 -0.845946 2000.0 350 0.000077 0.000065 -0.2559 0.4043 0.4 -0.0321 -0.004135 -0.003342 -0.003989 7.1785 7.0883 7.4889 0.005464 0.003891 15.0 -0.875246 2000.0 350 0.000076 0.000065 -0.2562 0.4029 0.45 -0.0321 -0.003973 -0.003063 -0.003934 7.1202 7.0100 7.4287 0.004657 0.017120 15.0 -0.892051 1973.0 350 0.000073 0.000065 -0.2564 0.4033 0.5 -0.0321 -0.003767 -0.002832 -0.003783 7.0604 6.9439 7.3615 0.003986 0.030246 15.0 -0.891130 1900.0 350 0.000071 0.000065 -0.2564 0.4019 0.6 -0.0321 -0.003389 -0.002450 -0.003351 6.9357 6.8166 7.2161 0.002946 0.057955 15.0 -0.869468 1779.9 350 0.000066 0.000065 -0.2561 0.4032 0.7 -0.0321 -0.002981 -0.002059 -0.002988 6.8272 6.6957 7.0854 0.002193 0.071145 15.0 -0.873924 1684.3 350 0.000062 0.000059 -0.2555 0.4038 0.8 -0.0321 -0.002640 -0.001692 -0.002587 6.7325 6.5864 6.9659 0.001641 0.089675 15.0 -0.846494 1605.7 350 0.000059 0.000054 -0.2547 0.4053 0.9 -0.0325 -0.002341 -0.001445 -0.002421 6.6845 6.5349 6.9211 0.001234 0.109109 15.0 -0.814706 1539.4 350 0.000056 0.000049 -0.2538 0.4085 1 -0.0327 -0.002138 -0.001322 -0.002331 6.6284 6.4748 6.8605 0.000936 0.128832 15.0 -0.778652 1482.4 350 0.000053 0.000045 -0.2527 0.4091 1.1 -0.0331 -0.001912 -0.001140 -0.002194 6.5971 6.4383 6.8304 0.000723 0.146198 15.3 -0.732989 1432.7 350 0.000051 0.000041 -0.2516 0.4074 1.2 -0.0337 -0.001790 -0.001053 -0.002213 6.5912 6.4200 6.8224 0.000576 0.161540 17.1 -0.703167 1388.7 350 0.000049 0.000038 -0.2505 0.4061 1.3 -0.0339 -0.001671 -0.000979 -0.002159 6.5588 6.3848 6.7827 0.000482 0.171349 19.0 -0.686586 1349.5 350 0.000047 0.000035 -0.2493 0.4046 1.5 -0.0347 -0.001516 -0.000811 -0.002020 6.5419 6.3510 6.7540 0.000417 0.195287 23.0 -0.650103 1282.1 350 0.000043 0.000030 -0.2469 0.4035 1.7 -0.0352 -0.001526 -0.000714 -0.001909 6.5209 6.3011 6.7004 0.000471 0.220718 27.2 -0.602410 1225.9 350 0.000040 0.000025 -0.2444 0.4007 2 -0.0359 -0.001604 -0.000673 -0.001576 6.4982 6.2617 6.6087 0.000703 0.253945 33.7 -0.543585 1156.6 350 0.000036 0.000019 -0.2407 0.3927 2.2 -0.0365 -0.001516 -0.000610 -0.001349 6.4920 6.2463 6.5766 0.000702 0.270206 38.3 -0.505691 1117.8 350 0.000033 0.000015 -0.2382 0.3883 2.5 -0.0375 -0.001457 -0.000586 -0.001266 6.4964 6.2485 6.5667 0.000826 0.291435 45.4 -0.458523 1067.8 350 0.000030 0.000010 -0.2346 0.3831 3 -0.0382 -0.001345 -0.000505 -0.001105 6.4414 6.1858 6.4858 0.001202 0.323118 57.8 -0.413921 1000.3 350 0.000025 0.000003 -0.2288 0.3775 3.5 -0.0384 -0.001270 -0.000512 -0.001000 6.3464 6.0849 6.3681 0.001647 0.355950 70.9 -0.375806 946.6 350 0.000022 -0.000003 -0.2232 0.3713 4 -0.0385 -0.001075 -0.000610 -0.001005 6.2459 6.0035 6.2727 0.002087 0.380773 84.7 -0.348309 902.4 350 0.000018 -0.000008 -0.2178 0.3646 4.5 -0.0389 -0.000904 -0.000605 -0.001061 6.1868 5.9423 6.2145 0.002489 0.405714 99.0 -0.309662 865.1 350 0.000015 -0.000012 -0.2126 0.3603 5 -0.0393 -0.000739 -0.000564 -0.001155 6.1466 5.8960 6.1817 0.002841 0.419676 113.8 -0.294664 833.1 350 0.000015 -0.000012 -0.2077 0.3552 5.5 -0.0398 -0.000570 -0.000626 -0.001254 6.1084 5.8725 6.1566 0.003139 0.434776 129.2 -0.289487 805.2 350 0.000015 -0.000012 -0.2029 0.3494 6 -0.0402 -0.000456 -0.000702 -0.001317 6.0920 5.8536 6.1257 0.003384 0.453344 145.0 -0.290399 780.5 350 0.000015 -0.000012 -0.1983 0.3428 6.5 -0.0405 -0.000308 -0.000785 -0.001361 6.0636 5.8218 6.0778 0.003580 0.455404 155.0 -0.281808 758.4 350 0.000015 -0.000012 -0.1939 0.3366 7 -0.0410 -0.000195 -0.000856 -0.001392 6.0586 5.8197 6.0652 0.003728 0.440951 155.0 -0.283250 738.5 350 0.000015 -0.000012 -0.1896 0.3300 7.5 -0.0412 -0.000109 -0.000880 -0.001413 6.0367 5.7971 6.0388 0.003833 0.427237 155.0 -0.275643 720.5 350 0.000015 -0.000012 -0.1855 0.3242 8 -0.0417 -0.000100 -0.000908 -0.001466 6.0378 5.7885 6.0381 0.003898 0.410255 155.0 -0.277723 704.1 350 0.000015 -0.000012 -0.1814 0.3185 8.5 -0.0419 -0.000100 -0.000940 -0.001496 6.0238 5.7674 6.0180 0.003927 0.393707 155.0 -0.278975 688.9 350 0.000015 -0.000012 -0.1775 0.3130 9 -0.0420 -0.000100 -0.001012 -0.001488 5.9972 5.7463 5.9881 0.003924 0.378643 155.0 -0.284384 675.0 350 0.000015 -0.000012 -0.1737 0.3090 9.5 -0.0423 -0.000100 -0.001098 -0.001485 5.9880 5.7507 5.9807 0.003890 0.363717 155.0 -0.290498 662.0 350 0.000015 -0.000012 -0.1701 0.3047 10 -0.0427 -0.000100 -0.001179 -0.001498 5.9820 5.7595 5.9869 0.003828 0.348396 155.0 -0.298398 650.0 350 0.000015 -0.000012 -0.1665 0.3007 """)
[docs]class MorikawaFujiwara2013SubInterface(MorikawaFujiwara2013Crustal): #: Supported tectonic region type is subduction interface DEFINED_FOR_TECTONIC_REGION_TYPE = const.TRT.SUBDUCTION_INTERFACE
[docs]class MorikawaFujiwara2013SubInterfaceNE(MorikawaFujiwara2013SubInterface): region = 'NE'
[docs]class MorikawaFujiwara2013SubInterfaceSW(MorikawaFujiwara2013SubInterface): region = 'SW'
[docs]class MorikawaFujiwara2013SubSlab(MorikawaFujiwara2013Crustal): #: Supported tectonic region type is subduction intraslab DEFINED_FOR_TECTONIC_REGION_TYPE = const.TRT.SUBDUCTION_INTRASLAB
[docs]class MorikawaFujiwara2013SubSlabNE(MorikawaFujiwara2013SubSlab): region = 'NE'
[docs]class MorikawaFujiwara2013SubSlabSW(MorikawaFujiwara2013SubSlab): region = 'SW'
### NIED 2025 Japan NSHM Variants ###
[docs]class MorikawaFujiwara2013CrustalNIED(MorikawaFujiwara2013Crustal): """ 2025 NSHM variant that uses an alternative distance-dependent sigma model that is described at: https://www.j-shis.bosai.go.jp/en/labs/mf2013/ (eq. 7) The distance type used is rrup. """
[docs] def compute(self, ctx: np.recarray, imts, mean, sig, tau, phi): # Compute the underlying mean super().compute(ctx, imts, mean, sig, tau, phi) # Apply the NIED sigma which is rrup-dependent _apply_nied_sigma( imts, sig, _get_nied_sigma_crustal(ctx.rrup))
[docs]class MorikawaFujiwara2013SubInterfaceNIED(MorikawaFujiwara2013SubInterface): """ 2025 NSHM variant that uses a PGV amplitude-dependent sigma model that is described in: https://www.j-shis.bosai.go.jp/en/labs/mf2013/ (eq. 8) PGV at Vs30=600 m/s as computed with Si and Midorikawa (1999) is required as an input parameter. This is the interface variant. """ # Required rupture parameters are magnitude and hypocentral position pars REQUIRES_RUPTURE_PARAMETERS = {'mag', 'hypo_depth', 'hypo_lon', 'hypo_lat'}
[docs] def compute(self, ctx: np.recarray, imts, mean, sig, tau, phi): # Compute the underlying mean super().compute(ctx, imts, mean, sig, tau, phi) # Apply the NIED sigma which is PGV dependent _apply_nied_sigma( imts, sig, _get_nied_sigma_subduction(ctx, -0.02))
[docs]class MorikawaFujiwara2013SubInterfaceNENIED(MorikawaFujiwara2013SubInterfaceNIED): region = 'NE' nshm25_nied = True # Apply 2025 NSHM specific adjustments
[docs]class MorikawaFujiwara2013SubInterfaceSWNIED(MorikawaFujiwara2013SubInterfaceNIED): region = 'SW' nshm25_nied = True # Apply 2025 NSHM specific adjustments
[docs]class MorikawaFujiwara2013SubSlabNIED(MorikawaFujiwara2013SubSlab): """ 2025 NSHM variant that uses a PGV amplitude-dependent sigma model that is described in: https://www.j-shis.bosai.go.jp/en/labs/mf2013/ (eq. 8) PGV at Vs30=600 m/s as computed with Si and Midorikawa (1999) is required as an input parameter. This is the inslab variant. """ # Required rupture parameters are magnitude and hypocentral position pars REQUIRES_RUPTURE_PARAMETERS = {'mag', 'hypo_depth', 'hypo_lon', 'hypo_lat'}
[docs] def compute(self, ctx: np.recarray, imts, mean, sig, tau, phi): # Compute the underlying mean super().compute(ctx, imts, mean, sig, tau, phi) # Apply the NIED sigma which is PGV-dependent _apply_nied_sigma( imts, sig, _get_nied_sigma_subduction(ctx, 0.12))
[docs]class MorikawaFujiwara2013SubSlabNENIED(MorikawaFujiwara2013SubSlabNIED): region = 'NE' nshm25_nied = True # Apply 2025 NSHM specific adjustments
[docs]class MorikawaFujiwara2013SubSlabSWNIED(MorikawaFujiwara2013SubSlabNIED): region = 'SW' nshm25_nied = True # Apply 2025 NSHM specific adjustments