package org.opensha2.gmm;
import static org.opensha2.gmm.GmmInput.Field.MW;
import static org.opensha2.gmm.GmmInput.Field.RRUP;
import static org.opensha2.gmm.GmmInput.Field.VS30;
import static org.opensha2.gmm.GmmUtils.BASE_10_TO_E;
import static org.opensha2.gmm.GmmUtils.atkinsonTableValue;
import org.opensha2.gmm.GmmInput.Constraints;
import org.opensha2.gmm.GroundMotionTables.GroundMotionTable;
import com.google.common.collect.Range;
import java.util.Map;
/**
* Implementation of the Pezeshk, Zandieh, & Tavakoli (2011) ground motion model
* for stable continental regions. This implementation matches that used in the
* 2014 USGS NSHMP and uses table lookups (median) and functional forms (sigma)
* to compute ground motions.
*
* <p><b>Note:</b> Direct instantiation of {@code GroundMotionModel}s is
* prohibited. Use {@link Gmm#instance(Imt)} to retrieve an instance for a
* desired {@link Imt}.
*
* <p><b>Implementation note:</b> Mean values are clamped per
* {@link GmmUtils#ceusMeanClip(Imt, double)}.
*
* <p><b>Reference:</b> Pezeshk, S., Zandieh, A., Tavakoli, B., 2011. Hybrid
* empirical ground-motion prediction equations for eastern North America using
* NGA models and updated seismological parameters: Bulletin of the
* Seismological Society of America, v. 101, no. 4, p. 1859–1870.
*
* <p><b>doi:</b> <a href="http://dx.doi.org/10.1785/0120100144">
* 10.1785/0120100144</a>
*
* <p><b>Component:</b> GMRotI50 (geometric mean)
*
* @author Peter Powers
* @see Gmm#PEZESHK_11
*/
public final class PezeshkEtAl_2011 implements GroundMotionModel {
static final String NAME = "Pezeshk et al. (2011)";
static final Constraints CONSTRAINTS = Constraints.builder()
.set(MW, Range.closed(4.0, 8.0))
.set(RRUP, Range.closed(0.0, 1000.0))
.set(VS30, Range.closed(760.0, 2000.0))
.build();
static final CoefficientContainer COEFFS = new CoefficientContainer("P11.csv");
private static final double SIGMA_FAC = -6.95e-3;
private static final class Coefficients {
final Imt imt;
final double c12, c13, c14, bcfac;
Coefficients(Imt imt, CoefficientContainer cc) {
this.imt = imt;
Map<String, Double> coeffs = cc.get(imt);
c12 = coeffs.get("c12");
c13 = coeffs.get("c13");
c14 = coeffs.get("c14");
bcfac = coeffs.get("bcfac");
}
}
private final Coefficients coeffs;
private final GroundMotionTable table;
PezeshkEtAl_2011(final Imt imt) {
coeffs = new Coefficients(imt, COEFFS);
table = GroundMotionTables.getPezeshk11(imt);
}
@Override
public final ScalarGroundMotion calc(final GmmInput in) {
double r = Math.max(in.rRup, 1.0);
double μ = atkinsonTableValue(table, coeffs.imt, in.Mw, r, in.vs30, coeffs.bcfac);
double σ = calcStdDev(coeffs, in.Mw);
return DefaultScalarGroundMotion.create(GmmUtils.ceusMeanClip(coeffs.imt, μ), σ);
}
private static double calcStdDev(final Coefficients c, final double Mw) {
double σ = (Mw <= 7.0) ? c.c12 * Mw + c.c13 : SIGMA_FAC * Mw + c.c14;
return σ * BASE_10_TO_E;
}
}