Skip to content
Snippets Groups Projects

fix broken MA05 interpolation

Files
6
package gov.usgs.earthquake.nshmp.gmm;
import static com.google.common.base.Preconditions.checkArgument;
import static gov.usgs.earthquake.nshmp.gmm.Gmm.BA_08_BASE;
import static gov.usgs.earthquake.nshmp.gmm.GmmInput.Field.MW;
import static gov.usgs.earthquake.nshmp.gmm.GmmInput.Field.RRUP;
@@ -27,7 +28,6 @@ import static gov.usgs.earthquake.nshmp.gmm.Imt.SA1P0;
import static java.lang.Math.log10;
import static java.lang.Math.sqrt;
import java.util.EnumMap;
import java.util.Map;
import java.util.Optional;
@@ -84,7 +84,7 @@ public class MotazedianAtkinson_2005 implements GroundMotionModel {
static final Constraints CONSTRAINTS = Constraints.builder()
.set(MW, Range.closed(4.0, 9.5))
.set(RRUP, Range.closed(0.0, 1000.0))
.set(VS30, Range.closedOpen(180.0, 1300.0))
.set(VS30, Range.closedOpen(150.0, 1500.0))
.build();
/*
@@ -142,7 +142,7 @@ public class MotazedianAtkinson_2005 implements GroundMotionModel {
coeffs = new Coefficients(imt, COEFFS);
interpolated = INTERPOLATED_IMTS.containsKey(imt);
interpolatedGmm = interpolated
? new InterpolatedGmm(Gmm.MA_05, imt, INTERPOLATED_IMTS.get(imt))
? new InterpolatedGmm(Gmm.MA_05_BASE, imt, INTERPOLATED_IMTS.get(imt))
: null;
}
@@ -179,7 +179,7 @@ public class MotazedianAtkinson_2005 implements GroundMotionModel {
double hingeFunction = getHingeFunction(r, Mw);
double μ = c.c1 + c.c2 * (Mw - 6) + c.c3 * (Mw - 6) * (Mw - 6) + hingeFunction + c.c4 * r;
// convert from base 10 to base 2 and from cm/s/s to g
// convert from base 10 to base e and from cm/s/s to g
return μ * BASE_10_TO_E - LN_G_CM_TO_M;
}
@@ -215,15 +215,16 @@ public class MotazedianAtkinson_2005 implements GroundMotionModel {
static final String NAME = "Motazedian & Atkinson (2005) BETA";
/* MA05 non-MPRS IMTs. */
private static final Map<Imt, Range<Imt>> INTERPOLATED_SITE_IMTS =
new EnumMap<>(Map.of(
SA0P06, Range.closed(SA0P05, SA0P75),
SA0P08, Range.closed(SA0P75, SA1P0),
SA0P12, Range.closed(SA0P1, SA0P15),
SA0P16, Range.closed(SA0P15, SA0P2),
SA0P6, Range.closed(SA0P5, SA0P75),
SA0P8, Range.closed(SA0P75, SA1P0)));
Maps.immutableEnumMap(
ImmutableMap.<Imt, Range<Imt>> builder()
.put(SA0P06, Range.closed(SA0P05, SA0P075))
.put(SA0P08, Range.closed(SA0P075, SA0P1))
.put(SA0P12, Range.closed(SA0P1, SA0P15))
.put(SA0P16, Range.closed(SA0P15, SA0P2))
.put(SA0P6, Range.closed(SA0P5, SA0P75))
.put(SA0P8, Range.closed(SA0P75, SA1P0))
.build());
private final Coefficients coeffsPGA;
private final Optional<BooreAtkinson_2008> siteAmp;
@@ -238,7 +239,9 @@ public class MotazedianAtkinson_2005 implements GroundMotionModel {
@Override
public LogicTree<GroundMotion> calc(GmmInput in) {
double μ = calcMean(super.coeffs, in.rRup, in.Mw);
// Get μ from MA_05_BASE for current IMT (interpolate if necessary)
double μ = GroundMotions.combine(super.calc(in)).mean();
double μPga = calcMean(coeffsPGA, in.rRup, in.Mw);
double site = siteAmp.isPresent()
? siteAmp.get().siteAmp(μPga, in.vs30)
@@ -247,9 +250,14 @@ public class MotazedianAtkinson_2005 implements GroundMotionModel {
}
private static double calcInterpolatedSite(Imt imt, double μPga, double vs30) {
Range<Imt> imts = INTERPOLATED_SITE_IMTS.get(imt);
Imt imtLo = imts.lowerEndpoint();
Imt imtHi = imts.upperEndpoint();
Range<Imt> imtRange = INTERPOLATED_SITE_IMTS.get(imt);
Imt imtLo = imtRange.lowerEndpoint();
Imt imtHi = imtRange.upperEndpoint();
// basic checks following InterpolatedGmm to catch bad Range<Imt>
checkArgument(imtLo.isSA());
checkArgument(imtHi.isSA());
checkArgument(imtRange.contains(imt));
double tLo = imtLo.period();
double tHi = imtHi.period();
double tTarget = imt.period();
Loading