Source code for pygmm.baker_jayaram_2008

"""Baker and Jayaram (2008, :cite:`baker08`) correlation model."""

import numpy as np

from .types import ArrayLike

__author__ = "Albert Kottke"


[docs] def calc_correls(periods: ArrayLike, period_cond: float) -> np.ndarray: """Baker and Jayaram (2008, :cite:`baker08`) correlation model. Parameters ---------- periods : array_like Periods at which the correlation should be computed. period_cond : float Conditioning period Returns ------- correls : :class:`np.ndarray` Correlation coefficients """ period_min = np.minimum(periods, period_cond) period_max = np.maximum(periods, period_cond) c_1 = 1 - np.cos( np.pi / 2 - 0.366 * np.log(period_max / np.maximum(period_min, 0.109)) ) # The minimum() is added to prevent an overflow issue c_2 = np.select( [period_max < 0.2, True], [ 1 - 0.105 * (1 - 1 / (1 + np.exp(100 * np.minimum(period_max, 0.2) - 5))) * (period_max - period_min) / (period_max - 0.0099), 0, ], ) c_3 = np.select([period_max < 0.109, True], [c_2, c_1]) c_4 = c_1 + 0.5 * (np.sqrt(c_3) - c_3) * (1 + np.cos(np.pi * period_min / 0.109)) correls = np.select( [period_max < 0.109, period_min > 0.109, period_max < 0.200, True], [c_2, c_1, np.minimum(c_2, c_4), c_4], ) return correls
[docs] def calc_cond_mean_spectrum( periods: ArrayLike, ln_psas: ArrayLike, ln_stds: ArrayLike, period_cond: float, ln_psa_cond: float, ) -> (np.ndarray, np.ndarray): """Conditional mean spectrum by Baker & Jayaram (2008, :cite:`baker08`). Parameters ---------- periods : array_like Response spectral periods. ln_psas : array_like Natural logarithm of the 5%-damped spectral accelerations. ln_stds : array_like Logarithmic standard deviations. period_cond : float Conditioning period. This period does not need to be included in `periods`. ln_psa_cond : float Natural logarithm of the response at the conditioning period. Returns ------- ln_psas_cms : :class:`np.ndarray` Natural logarithm of the conditional mean spectral accelerations. ln_stds_cms : :class:`np.ndarray` Logarithmic standard deviation of the conditional mean spectral acceleration. """ periods = np.asarray(periods) ln_psas = np.asarray(ln_psas) ln_stds = np.asarray(ln_stds) correls = calc_correls(periods, period_cond) epsilon = (ln_psa_cond - np.interp(period_cond, periods, ln_psas)) / np.interp( period_cond, periods, ln_stds ) ln_psas_cms = ln_psas + ln_stds * correls * epsilon ln_stds_cms = np.sqrt(ln_stds**2 * (1 - correls**2)) return ln_psas_cms, ln_stds_cms