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.MagConverter.NONE;
import static org.opensha2.gmm.SiteClass.HARD_ROCK;
import static org.opensha2.gmm.SiteClass.SOFT_ROCK;
import org.opensha2.gmm.GmmInput.Constraints;
import org.opensha2.gmm.GroundMotionTables.GroundMotionTable;
import com.google.common.collect.Range;
/**
* Implementation of the Frankel et al. (1996) ground motion model for stable
* continental regions. This implementation matches that used in the 2008 USGS
* NSHMP and comes in two additional magnitude converting (mb to Mw) flavors to
* support the 2008 central and eastern US model.
*
* <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> Frankel, A., Mueller, C., Barnhard, T., Perkins, D.,
* Leyendecker, E., Dickman, N., Hanson, S., and Hopper, M., 1996, National
* Seismic Hazard Maps—Documentation June 1996: U.S. Geological Survey Open-File
* Report 96–532, 110 p.
*
* <p><b>Component:</b> not specified
*
* @author Peter Powers
* @see Gmm#FRANKEL_96
* @see Gmm#FRANKEL_96_AB
* @see Gmm#FRANKEL_96_J
*/
public class FrankelEtAl_1996 implements GroundMotionModel, ConvertsMag {
static final String NAME = "Frankel et al. (1996)";
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("Frankel96.csv");
private final double bσ;
private final Imt imt;
private final GroundMotionTable bcTable;
private final GroundMotionTable aTable;
FrankelEtAl_1996(Imt imt) {
this.imt = imt;
bσ = COEFFS.get(imt, "bsigma");
bcTable = GroundMotionTables.getFrankel96(imt, SOFT_ROCK);
aTable = GroundMotionTables.getFrankel96(imt, HARD_ROCK);
}
@Override
public final ScalarGroundMotion calc(GmmInput in) {
SiteClass siteClass = GmmUtils.ceusSiteClass(in.vs30);
double Mw = converter().convert(in.Mw);
double μ = (siteClass == SOFT_ROCK) ? bcTable.get(in.rRup, Mw) : aTable.get(in.rRup, Mw);
μ = GmmUtils.ceusMeanClip(imt, μ * BASE_10_TO_E);
double σ = bσ * BASE_10_TO_E;
return DefaultScalarGroundMotion.create(μ, σ);
}
@Override
public MagConverter converter() {
return NONE;
}
}