Compare commits
	
		
			5 Commits
		
	
	
		
			ftong-patc
			...
			a8233950e1
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| a8233950e1 | |||
| 86da5c3246 | |||
| 9e75e0e768 | |||
| a73f17fc35 | |||
| 2fbca21917 | 
							
								
								
									
										142
									
								
								gsim/lasocki_2013.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										142
									
								
								gsim/lasocki_2013.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,142 @@
 | 
			
		||||
# -*- coding: utf-8 -*-
 | 
			
		||||
# vim: tabstop=4 shiftwidth=4 softtabstop=4
 | 
			
		||||
#
 | 
			
		||||
# Copyright (C) 2013-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:`Lasocki2013`.
 | 
			
		||||
"""
 | 
			
		||||
import numpy as np
 | 
			
		||||
from scipy.constants import g
 | 
			
		||||
 | 
			
		||||
from openquake.hazardlib.gsim.base import GMPE, CoeffsTable
 | 
			
		||||
from openquake.hazardlib import const
 | 
			
		||||
from openquake.hazardlib.imt import PGA, PGV, SA
 | 
			
		||||
 | 
			
		||||
def get_magnitude_energy(mag):
 | 
			
		||||
    """
 | 
			
		||||
    Converts magnitude to energy-based magnitude term.
 | 
			
		||||
    """
 | 
			
		||||
    return 1.15 + 1.96 * mag
 | 
			
		||||
 | 
			
		||||
def get_distance_term(coeffs, repi):
 | 
			
		||||
    """
 | 
			
		||||
    Computes the distance term using the given GMPE coefficients.
 | 
			
		||||
    """
 | 
			
		||||
    R_h = np.sqrt(repi ** 2 + coeffs["c7"] ** 2)
 | 
			
		||||
    return np.log10(R_h)
 | 
			
		||||
 | 
			
		||||
def get_standard_deviation(coeffs, coeffs_cov, magE, repi):
 | 
			
		||||
    """
 | 
			
		||||
    Computes the standard deviation term.
 | 
			
		||||
    """
 | 
			
		||||
    Cb = np.array(list(coeffs_cov)).reshape(3,3)
 | 
			
		||||
    R_h = np.sqrt(repi ** 2 + coeffs["c7"] ** 2)
 | 
			
		||||
    X0 = np.array([1, magE[0], np.log10(R_h[0]**2)])
 | 
			
		||||
    variance_term = np.sqrt(X0 @ Cb @ X0 + coeffs["sigma"]**2)
 | 
			
		||||
    return variance_term
 | 
			
		||||
 | 
			
		||||
class Lasocki2013(GMPE):
 | 
			
		||||
    """
 | 
			
		||||
    Implement equation developed by Lasocki in "REPORT ON THE ATTENUATION 
 | 
			
		||||
    RELATIONS OF PEAK GROUND ACCELERATION AND SPECTRAL ORDINATES OF GROUND 
 | 
			
		||||
    MOTION FOR MINING-INDUCED SEISMIC EVENTS IN THE REGION OF THE ŻELAZNY 
 | 
			
		||||
    MOST REPOSITORY", 2009.
 | 
			
		||||
    Equation coefficients provided for the random horizontal component
 | 
			
		||||
    """
 | 
			
		||||
    #: Supported tectonic region type is induced, given
 | 
			
		||||
    #: that the equations have been derived for the LGCD mining area
 | 
			
		||||
    DEFINED_FOR_TECTONIC_REGION_TYPE = const.TRT.INDUCED
 | 
			
		||||
 | 
			
		||||
    #: Supported intensity measure types are spectral acceleration,
 | 
			
		||||
    #: and peak ground acceleration
 | 
			
		||||
    DEFINED_FOR_INTENSITY_MEASURE_TYPES = {PGA, SA}
 | 
			
		||||
 | 
			
		||||
    #: Supported intensity measure component is random horizontal
 | 
			
		||||
    #: :attr:`~openquake.hazardlib.const.IMC.RANDOM_HORIZONTAL`,
 | 
			
		||||
    DEFINED_FOR_INTENSITY_MEASURE_COMPONENT = const.IMC.RANDOM_HORIZONTAL
 | 
			
		||||
    # DEFINED_FOR_INTENSITY_MEASURE_COMPONENT = const.IMC.VERTICAL
 | 
			
		||||
 | 
			
		||||
    #: Supported standard deviation type is total
 | 
			
		||||
    DEFINED_FOR_STANDARD_DEVIATION_TYPES = {const.StdDev.TOTAL}
 | 
			
		||||
 | 
			
		||||
    #: site params are not required
 | 
			
		||||
    REQUIRES_SITES_PARAMETERS = set()
 | 
			
		||||
 | 
			
		||||
    #: Required rupture parameter is magnitude
 | 
			
		||||
    REQUIRES_RUPTURE_PARAMETERS = {'mag'}
 | 
			
		||||
 | 
			
		||||
    #: Required distance measure is epicentral distance
 | 
			
		||||
    #: see paragraph 'Predictor Variables', page 6.
 | 
			
		||||
    REQUIRES_DISTANCES = {'repi'}
 | 
			
		||||
 | 
			
		||||
    def compute(self, ctx: np.recarray, imts, mean, sig, tau, phi):
 | 
			
		||||
        """
 | 
			
		||||
        Computes mean ground motion values and standard deviations for Lasocki (2013) GMPE.
 | 
			
		||||
        
 | 
			
		||||
        Parameters:
 | 
			
		||||
            repi (float): Epicentral distance (m)
 | 
			
		||||
            mag (float): Earthquake magnitude
 | 
			
		||||
            imts (list of str): List of intensity measure types (e.g., 'PHA', 'PVA')
 | 
			
		||||
            mean (np.array): Array to store computed mean values
 | 
			
		||||
            sig (np.array): Array to store computed standard deviations
 | 
			
		||||
        """
 | 
			
		||||
        # Loop through each IMT and compute values
 | 
			
		||||
        for i, imt in enumerate(imts):            
 | 
			
		||||
            C = self.COEFFS[imt]
 | 
			
		||||
            C_cov = self.COEFFS_COV[imt]
 | 
			
		||||
            mag = ctx.mag
 | 
			
		||||
            repi = ctx.repi*1000.0 # Convert distance from km to m
 | 
			
		||||
            # Compute magnitude energy term
 | 
			
		||||
            magE = get_magnitude_energy(mag)
 | 
			
		||||
 | 
			
		||||
            # Compute GMPE terms
 | 
			
		||||
            mag_term = C['c1'] + C['c2'] * magE
 | 
			
		||||
            dist_term = C['c5'] * get_distance_term(C, repi)
 | 
			
		||||
            
 | 
			
		||||
            # Compute mean ground motion
 | 
			
		||||
            imean = mag_term + dist_term
 | 
			
		||||
            mean_value = np.log((10 ** imean) / g)  # Convert to natural log scale and divide by g
 | 
			
		||||
            mean[i] = mean_value
 | 
			
		||||
 | 
			
		||||
            # Compute standard deviation
 | 
			
		||||
            sigma = get_standard_deviation(C, C_cov, magE, repi)
 | 
			
		||||
            sig[i] = sigma
 | 
			
		||||
 | 
			
		||||
    #: coefficient table provided by report
 | 
			
		||||
    COEFFS = CoeffsTable(sa_damping=5, table="""\
 | 
			
		||||
    IMT  c1     c2      c5      c7    sigma     N        
 | 
			
		||||
    pga  1.25   0.31    -1.34   558   0.196     1196
 | 
			
		||||
    0.6  -3.86  0.55    -0.65   183   0.242     1194
 | 
			
		||||
    1.0  -3.94  0.62    -0.66   308   0.262     1197
 | 
			
		||||
    2.0  -1.14  0.47    -1.02   741   0.235     1195
 | 
			
		||||
    5.0  0.99   0.31    -1.15   690   0.234     1206
 | 
			
		||||
    10.0 3.06   0.27    -1.65   906   0.203     1192
 | 
			
		||||
    20.0 2.62   0.27    -1.60   435   0.196     1191
 | 
			
		||||
    50.0 2.09   0.27    -1.48   375   0.204     1191
 | 
			
		||||
    """)
 | 
			
		||||
    
 | 
			
		||||
    COEFFS_COV = CoeffsTable(sa_damping=5, table="""\
 | 
			
		||||
    IMT  Cb00      Cb01      Cb02      Cb10      Cb11      Cb12      Cb20      Cb21      Cb22        
 | 
			
		||||
    pga  0.005586  -0.000376 -0.000752 -0.000376 0.000103  -0.000111 -0.000752 -0.000111 0.000440
 | 
			
		||||
    0.6  0.007509  -0.000662 -0.000688 -0.000662 0.000161  -0.000154 -0.000688 -0.000154 0.000516
 | 
			
		||||
    1.0  0.009119  -0.00075  -0.000948 -0.00075  0.000189  -0.000187 -0.000948 -0.000187 0.000657                 
 | 
			
		||||
    2.0  0.008563  -0.000514 -0.001282 -0.000514 0.000147  -0.000164 -0.001282 -0.000164 0.000696         
 | 
			
		||||
    5.0  0.008283  -0.000516 -0.001202 -0.000516 0.000145  -0.000161 -0.001202 -0.000161 0.000668
 | 
			
		||||
   10.0  0.006904  -0.00036  -0.001145 -0.00036  0.000108  -0.000126 -0.001145 -0.000126 0.000578
 | 
			
		||||
   20.0  0.005389  -0.000396 -0.000658 -0.000396 0.000104  -0.000107 -0.000658 -0.000107 0.000408
 | 
			
		||||
   50.0  0.005874  -0.000449 -0.000678 -0.000449 0.000114  -0.000114 -0.000678 -0.000114 0.000428
 | 
			
		||||
    """)
 | 
			
		||||
@@ -366,6 +366,8 @@ verbose: {verbose}")
 | 
			
		||||
 | 
			
		||||
        # Assign probabilities 
 | 
			
		||||
        lambdas, lambdas_perc = lambda_probs(act_rate, dates_calc, bin_edges)
 | 
			
		||||
        lambdas = np.array(lambdas, dtype='d')
 | 
			
		||||
        lambdas_perc = np.array(lambdas_perc, dtype='d')
 | 
			
		||||
        
 | 
			
		||||
        # print("Forecasted activity rates: ", lambdas, "events per", time_unit[:-1])
 | 
			
		||||
        logger.info(f"Forecasted activity rates: {lambdas} events per {time_unit} with percentages {lambdas_perc}")
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user