Source code for shakelib.conversions.imt.newmark_hall_1982
# Standard library imports
import copy
# Third party imports
import numpy as np
# Local imports
from shakelib.conversions.convert_imt import IMTConverter
[docs]class NewmarkHall1982(IMTConverter):
"""
Class for conversion between PGA and PSA10 by Newmark and Hall (1982).
- PSA10 stands for spectral acceleration with oscillator period of 1.0 sec
- PGV is peak ground velocity.
The conversion factor is 37.27*2.54.
Note that 2.54 is the conversion factor to convert from cm/s to in/s and
37.27 is derived from SA(f) = 1.65*(2*pi*V*f)/386.09, where:
- SA(f) is spectral acceleration at frequency f (in g)
- f is the frequency of interest
- V is the velocity
- 1.65 is the N&H amplification factor for velocity at 5% damping
- 386.09 is the acceleration of gravity in inches per second per g
The sigma factor was computed from an average sigma value determined
by plotting PGV/PSA10 versus Distance for earthquakes with magnitudes
greater than or equal to 5.0.
References:
Newmark, N. M., & Hall, W. J. (1982). Earthquake spectra and design.
Earthquake Engineering Research Institute, El Cerrito, California.
"""
def __init__(self):
super().__init__()
# output_input dictionary where the key is the output
# and the value is a list of the possible inputs
self.output_input = {"PGV": ["PSA10"]}
self._lnfact = np.log(37.27 * 2.54)
self.conversion_factor = np.exp(self._lnfact)
self._lnsigma = 0.5146578
[docs] def convertAmps(self, imt_in, imt_out, imt):
"""
Returns an array of converted IMT amplitude values.
Args:
imt_in (str): OQ intensity measure type. Same as type as the input
values defined by the imt variable.
imt_out (str): OQ intensity measure type that the values will
be converted to.
imt (OpenQuake IMT): The intensity measurements of the input
ground motions. Valid IMTs are PGV, and SA.
Returns:
array: Numpy array of amps converted from imt_in to imt_out.
Raises:
ValueError: If not a valid conversion.
"""
self._verifyConversion(imt_in, imt_out)
imt_in = imt_in.upper().strip()
imt_out = imt_out.upper().strip()
conversion_factor = self._lnfact
if imt_in == "PSA10" and imt_out == "PGV":
new_imt = self._convertToPGV(imt, conversion_factor)
else:
raise ValueError(f"No conversion available from {imt_in!r} to {imt_out!r}")
return new_imt
[docs] def convertSigmas(self, imt_in, imt_out, sigma):
"""
Convert standard deviation to natural log units.
Args:
imt_in (str): OQ intensity measure type. Same as type as the input
values defined by the imt variable.
imt_out (str): OQ intensity measure type that the values will
be converted to.
sigma (array): Numpy array or float of standard deviation of PGV from a GMPE;
units must be natural log.
Returns:
array: Converted standard deviations with natural log units.
"""
self._verifyConversion(imt_in, imt_out)
lnsigma = self._lnsigma
sigmaTot = np.sqrt((sigma ** 2) + (lnsigma ** 2))
return sigmaTot
[docs] def getLnSigma(self):
"""
Returns:
float: The the estimate of the logarithmic standard deviation of the PGV
predicted by Newmark and Hall (1982).
"""
return copy.copy(self._lnsigma)
@staticmethod
def _convertToPGV(psa10, lnfact):
"""
Convert PSA10 (spectral acceleration with oscillator period of 1.0 sec)
to PGV.
**Important:** PSA10 and sigma must be logarithmic units.
Args:
psa10 (array): OQ intensity measure type. Same as type as the input
values defined by the imt variable.
lnfact (float): Conversion factor.
Returns:
array: Converted PGV values with natural log of cm/s units.
"""
pgv = psa10 + lnfact
return pgv