From 194f9fcffefd2961a69ee133360b44b73fd2224e Mon Sep 17 00:00:00 2001
From: Peter Powers <pmpowers@usgs.gov>
Date: Thu, 25 Jun 2015 14:01:33 -0600
Subject: [PATCH] cleanup; changed SINGLE mfd a to rate

---
 etc/examples/README.md                        |  2 +-
 .../eq/fault/surface/RuptureFloating.java     | 57 ++++++-------
 .../opensha2/eq/model/AbstractSourceSet.java  |  2 +-
 src/org/opensha2/eq/model/AreaParser.java     |  2 +-
 src/org/opensha2/eq/model/ClusterParser.java  |  6 +-
 src/org/opensha2/eq/model/FaultParser.java    |  6 +-
 src/org/opensha2/eq/model/GridParser.java     |  2 +-
 src/org/opensha2/eq/model/HazardModel.java    | 27 +++---
 .../opensha2/eq/model/InterfaceParser.java    |  2 +-
 .../opensha2/eq/model/InterfaceSource.java    |  7 +-
 src/org/opensha2/eq/model/MfdHelper.java      | 25 ++++--
 .../opensha2/eq/model/SourceAttribute.java    |  1 +
 src/org/opensha2/gmm/AtkinsonBoore_2003.java  | 82 ++++++++++---------
 src/org/opensha2/gmm/Gmm.java                 |  4 +-
 test/org/opensha2/gmm/SubSlab.java            |  8 +-
 15 files changed, 120 insertions(+), 113 deletions(-)

diff --git a/etc/examples/README.md b/etc/examples/README.md
index f0fafc5b7..230a68e05 100644
--- a/etc/examples/README.md
+++ b/etc/examples/README.md
@@ -5,7 +5,7 @@ The simplest way to run the HazardCurve program via the command-line is to suppl
 ```
 java -cp ../../dist/nshmp-haz.jar org.opensha2.programs.HazardCurve model
 ```
-By way of example, the [configuration file](https://github.com/usgs/nshmp-haz/blob/master/etc/examples/model/config.json) in the model above omits any site data and a default Los Angeles site is used. Remember that calculation [configuration parameters](https://github.com/usgs/nshmp-haz/wiki/Configuration) need not be supplied. The result of this calculation should be available as a single file containing one hazard curve for PGA in a newly created 'results' directory.
+By way of example, the [configuration file](https://github.com/usgs/nshmp-haz/blob/master/etc/examples/model/config.json) in the model above omits any site data and a default Los Angeles site is used. Remember that [calculation configuration](https://github.com/usgs/nshmp-haz/wiki/Configuration) parameters need not be supplied. The result of this calculation should be available as a single file containing one hazard curve for PGA in a newly created 'results' directory.
 
 One can override calculation configuration parameters by supplying an alternate configuration file. For example:
 ```
diff --git a/src/org/opensha2/eq/fault/surface/RuptureFloating.java b/src/org/opensha2/eq/fault/surface/RuptureFloating.java
index 619e8918a..c7abe7d51 100644
--- a/src/org/opensha2/eq/fault/surface/RuptureFloating.java
+++ b/src/org/opensha2/eq/fault/surface/RuptureFloating.java
@@ -18,16 +18,13 @@ import org.opensha2.geo.LocationList;
 import com.google.common.collect.Range;
 
 /**
- * Gridded surface floating model identifiers. Each provides the means to create
- * a List of {@link GriddedSubsetSurface}s from a RuptureScaling
- * {@link DefaultGriddedSurface} to an immutable list of {@link Rupture}s.
+ * Rupture floating models for gridded surfaces. Each provides the means to
+ * create an immutable {@code List} of {@link Rupture}s from a
+ * {@link GriddedSurface}, magnitude, rate, rake, and uncertainty flag.
  * 
  * <p>NOTE: Only {@code ON} currently recognizes and applies rupture area
  * uncertainty.</p>
  * 
- * <p>TODO: This should also handle down dip variations in hypocenter wieght;
- * the so-called PEER triangular distribution.
- *
  * @author Peter Powers
  */
 public enum RuptureFloating {
@@ -110,7 +107,7 @@ public enum RuptureFloating {
 				d.length, d.width);
 
 			return null;
-			// TODO
+			// TODO complete implementation
 
 		}
 
@@ -135,8 +132,7 @@ public enum RuptureFloating {
 		return floaters;
 	}
 
-	// TODO this should return RuptureSurface, perhaps; do we need grid-specific
-	// info after this point?
+	// TODO why is this taking DefaultGriddedSurface instead of GriddedSurface
 	/**
 	 * Create a {@code List} of floating ruptures
 	 * @param surface (gridded) from which floaters are derived
@@ -157,13 +153,9 @@ public enum RuptureFloating {
 		// else [zTop, +2, +4, +6]
 
 		double zTop = parent.depth();
-		// @formatter:off
-		int downDipCount = 
-				(zTop > 1.0) ? 1 :
-				(mag > 7.0) ? 1 :
-				(mag > 6.75) ? 2 :
+		int downDipCount = (zTop > 1.0 || mag > 7.0) ? 1 :
+			(mag > 6.75) ? 2 :
 				(mag > 6.5) ? 3 : 4;
-		// @formatter:on
 		List<Double> zTopWidths = new ArrayList<>();
 
 		for (int i = 0; i < downDipCount; i++) {
@@ -316,29 +308,30 @@ public enum RuptureFloating {
 
 	// TODO clean
 	public static void main(String[] args) {
-//		double zTop = 0.0;
-//		double zBot = 30.0;
-//		double[] depths = { 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28 };
-//		double[] weights = generateTriangularWeights(zTop, zBot, depths);
-//		System.out.println(Arrays.toString(weights));
-//		System.out.println(DataUtils.sum(weights));
-		
+		// double zTop = 0.0;
+		// double zBot = 30.0;
+		// double[] depths = { 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26,
+		// 28 };
+		// double[] weights = generateTriangularWeights(zTop, zBot, depths);
+		// System.out.println(Arrays.toString(weights));
+		// System.out.println(DataUtils.sum(weights));
+
 		DefaultGriddedSurface surf = DefaultGriddedSurface.builder()
-				.trace(LocationList.create(
-					Location.create(33.0, -118.0),
-					Location.create(33.5, -118.0)))
-				.depth(0.0)
-				.width(30.0)
-				.dip(90.0)
-				.build();
-		
+			.trace(LocationList.create(
+				Location.create(33.0, -118.0),
+				Location.create(33.5, -118.0)))
+			.depth(0.0)
+			.width(30.0)
+			.dip(90.0)
+			.build();
+
 		Dimensions d = RuptureScaling.PEER.dimensions(7.0, 30.0);
 		System.out.println(d);
-		
+
 		Map<GriddedSurface, Double> map = createWeightedFloatingSurfaces(surf, d.length, d.width);
 		System.out.println(DataUtils.sum(map.values()));
 		System.out.println(map.size());
-		
+
 	}
 
 }
diff --git a/src/org/opensha2/eq/model/AbstractSourceSet.java b/src/org/opensha2/eq/model/AbstractSourceSet.java
index 40e7a8d46..873e9c100 100644
--- a/src/org/opensha2/eq/model/AbstractSourceSet.java
+++ b/src/org/opensha2/eq/model/AbstractSourceSet.java
@@ -46,7 +46,7 @@ abstract class AbstractSourceSet<T extends Source> implements SourceSet<T> {
 	@Override public String toString() {
 		StringBuilder sb = new StringBuilder();
 		sb.append(" Id: ").append(padEnd(Integer.toString(id), 8, ' '));
-		sb.append("Name: ").append(padEnd(name, 27, ' '));
+		sb.append("Name: ").append(padEnd(name, 32, ' '));
 		sb.append("Size: ").append(padEnd(Integer.toString(size()), 8, ' '));
 		sb.append("Weight: ").append(padEnd(Double.toString(weight), 12, ' '));
 		return sb.toString();
diff --git a/src/org/opensha2/eq/model/AreaParser.java b/src/org/opensha2/eq/model/AreaParser.java
index 46550af75..bb58d6c23 100644
--- a/src/org/opensha2/eq/model/AreaParser.java
+++ b/src/org/opensha2/eq/model/AreaParser.java
@@ -251,7 +251,7 @@ class AreaParser extends DefaultHandler {
 
 			case SINGLE:
 				MfdHelper.SingleData singleData = mfdHelper.getSingle(atts);
-				return Mfds.newSingleMFD(singleData.m, singleData.a * singleData.weight,
+				return Mfds.newSingleMFD(singleData.m, singleData.rate * singleData.weight,
 					singleData.floats);
 
 			case GR_TAPER:
diff --git a/src/org/opensha2/eq/model/ClusterParser.java b/src/org/opensha2/eq/model/ClusterParser.java
index b024f8489..5cfb028d9 100644
--- a/src/org/opensha2/eq/model/ClusterParser.java
+++ b/src/org/opensha2/eq/model/ClusterParser.java
@@ -4,14 +4,14 @@ import static com.google.common.base.Preconditions.checkNotNull;
 import static com.google.common.base.Preconditions.checkState;
 import static java.util.logging.Level.FINE;
 import static java.util.logging.Level.FINEST;
-import static org.opensha2.eq.model.SourceAttribute.A;
 import static org.opensha2.eq.model.SourceAttribute.DEPTH;
 import static org.opensha2.eq.model.SourceAttribute.DIP;
 import static org.opensha2.eq.model.SourceAttribute.ID;
 import static org.opensha2.eq.model.SourceAttribute.M;
-import static org.opensha2.eq.model.SourceAttribute.RUPTURE_SCALING;
 import static org.opensha2.eq.model.SourceAttribute.NAME;
 import static org.opensha2.eq.model.SourceAttribute.RAKE;
+import static org.opensha2.eq.model.SourceAttribute.RATE;
+import static org.opensha2.eq.model.SourceAttribute.RUPTURE_SCALING;
 import static org.opensha2.eq.model.SourceAttribute.TYPE;
 import static org.opensha2.eq.model.SourceAttribute.WEIGHT;
 import static org.opensha2.eq.model.SourceAttribute.WIDTH;
@@ -185,7 +185,7 @@ class ClusterParser extends DefaultHandler {
 					if (parsingDefaultMFDs) {
 						checkState(readEnum(TYPE, atts, MfdType.class) == MfdType.SINGLE,
 							"Only SINGLE MFDs are supported by cluster sources");
-						clusterRate = readDouble(A, atts);
+						clusterRate = readDouble(RATE, atts);
 						break;
 					}
 					faultBuilder.mfd(buildMFD(atts));
diff --git a/src/org/opensha2/eq/model/FaultParser.java b/src/org/opensha2/eq/model/FaultParser.java
index f4c633943..ff8cb70a9 100644
--- a/src/org/opensha2/eq/model/FaultParser.java
+++ b/src/org/opensha2/eq/model/FaultParser.java
@@ -324,9 +324,9 @@ class FaultParser extends DefaultHandler {
 		List<IncrementalMfd> mfds = Lists.newArrayList();
 
 		// total moment rate
-		double tmr = data.a * Magnitudes.magToMoment_N_m(data.m);
+		double tmr = data.rate * Magnitudes.magToMoment_N_m(data.m);
 		// total event rate
-		double tcr = data.a;
+		double tcr = data.rate;
 
 		// this was handled previously by GR_Data.hasMagExceptions()
 		// need to catch the single floaters that are less than 6.5
@@ -370,7 +370,7 @@ class FaultParser extends DefaultHandler {
 				log.finer("   MFD type: SINGLE [-epi +alea]");
 				if (log.isLoggable(FINEST)) log.finest(mfd.getMetadataString());
 			} else {
-				IncrementalMfd mfd = Mfds.newSingleMFD(data.m, data.weight * data.a, data.floats);
+				IncrementalMfd mfd = Mfds.newSingleMFD(data.m, data.weight * data.rate, data.floats);
 				mfds.add(mfd);
 				log.finer("   MFD type: SINGLE [-epi -alea]");
 				if (log.isLoggable(FINEST)) log.finest(mfd.getMetadataString());
diff --git a/src/org/opensha2/eq/model/GridParser.java b/src/org/opensha2/eq/model/GridParser.java
index 5bebbb888..2cb845b71 100644
--- a/src/org/opensha2/eq/model/GridParser.java
+++ b/src/org/opensha2/eq/model/GridParser.java
@@ -279,7 +279,7 @@ class GridParser extends DefaultHandler {
 
 			case SINGLE:
 				MfdHelper.SingleData singleData = mfdHelper.getSingle(atts);
-				return Mfds.newSingleMFD(singleData.m, singleData.a * singleData.weight,
+				return Mfds.newSingleMFD(singleData.m, singleData.rate * singleData.weight,
 					singleData.floats);
 
 			case GR_TAPER:
diff --git a/src/org/opensha2/eq/model/HazardModel.java b/src/org/opensha2/eq/model/HazardModel.java
index 0bef42071..7e94c59c3 100644
--- a/src/org/opensha2/eq/model/HazardModel.java
+++ b/src/org/opensha2/eq/model/HazardModel.java
@@ -17,13 +17,13 @@ import com.google.common.collect.ImmutableSetMultimap;
 import com.google.common.collect.SetMultimap;
 
 /**
- * An earthquake hazard {@code HazardModel} is the top-level wrapper for
- * earthquake {@link Source} definitions and attendant {@link GroundMotionModel}
- * s used in probabilisitic seismic hazard analyses (PSHAs) and related
- * calculations. A {@code HazardModel} contains of a number of {@link SourceSet}
- * s that define logical groupings of sources by {@link SourceType}. Each
- * {@code SourceSet} carries with it references to the {@code GroundMotionModel}
- * s and associated weights to be used when evaluating hazard.
+ * A {@code HazardModel} is the top-level wrapper for earthquake {@link Source}
+ * definitions and attendant {@link GroundMotionModel}s used in probabilisitic
+ * seismic hazard analyses (PSHAs) and related calculations. A
+ * {@code HazardModel} contains of a number of {@link SourceSet}s that define
+ * logical groupings of sources by {@link SourceType}. Each {@code SourceSet}
+ * carries with it references to the {@code GroundMotionModel}s and associated
+ * weights to be used when evaluating hazard.
  * 
  * @author Peter Powers
  * @see Source
@@ -55,12 +55,14 @@ public final class HazardModel implements Iterable<SourceSet<? extends Source>>,
 	private final String name;
 	private final SetMultimap<SourceType, SourceSet<? extends Source>> sourceSetMap;
 	private final CalcConfig config;
-	
-	// TODO do we really need config here; calc config properties will likely be accessed from the 
-	// source set or source level; should probably push config to SourceSets, possibly overriding default
+
+	// TODO do we really need config here; calc config properties will likely be
+	// accessed from the
+	// source set or source level; should probably push config to SourceSets,
+	// possibly overriding default
 
 	private HazardModel(String name, CalcConfig config,
-		SetMultimap<SourceType, SourceSet<? extends Source>> sourceSetMap) {
+			SetMultimap<SourceType, SourceSet<? extends Source>> sourceSetMap) {
 		this.name = name;
 		this.config = config;
 		this.sourceSetMap = sourceSetMap;
@@ -101,8 +103,7 @@ public final class HazardModel implements Iterable<SourceSet<? extends Source>>,
 	@Override public String name() {
 		return name;
 	}
-	
-	
+
 	/**
 	 * Return the default calculation configuration. This may be overridden.
 	 */
diff --git a/src/org/opensha2/eq/model/InterfaceParser.java b/src/org/opensha2/eq/model/InterfaceParser.java
index cceee39bb..43ce03b3b 100644
--- a/src/org/opensha2/eq/model/InterfaceParser.java
+++ b/src/org/opensha2/eq/model/InterfaceParser.java
@@ -272,7 +272,7 @@ class InterfaceParser extends DefaultHandler {
 
 	/* Builds single MFD */
 	private IncrementalMfd buildSingle(MfdHelper.SingleData data) {
-		IncrementalMfd mfd = Mfds.newSingleMFD(data.m, data.weight * data.a, data.floats);
+		IncrementalMfd mfd = Mfds.newSingleMFD(data.m, data.weight * data.rate, data.floats);
 		log.finer("   MFD type: SINGLE");
 		if (log.isLoggable(FINEST)) log.finest(mfd.getMetadataString());
 		return mfd;
diff --git a/src/org/opensha2/eq/model/InterfaceSource.java b/src/org/opensha2/eq/model/InterfaceSource.java
index d5d4ab407..c55eeff57 100644
--- a/src/org/opensha2/eq/model/InterfaceSource.java
+++ b/src/org/opensha2/eq/model/InterfaceSource.java
@@ -4,16 +4,14 @@ import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkNotNull;
 import static com.google.common.base.StandardSystemProperty.LINE_SEPARATOR;
 import static org.opensha2.eq.fault.Faults.validateInterfaceDepth;
-import static org.opensha2.eq.fault.Faults.validateTrace;
 import static org.opensha2.eq.fault.Faults.validateInterfaceWidth;
-import static org.opensha2.eq.model.FloatStyle.FULL_DOWN_DIP;
+import static org.opensha2.eq.fault.Faults.validateTrace;
 
 import java.util.List;
 
-import org.opensha2.eq.fault.scaling.MagScalingRelationship;
 import org.opensha2.eq.fault.surface.ApproxGriddedSurface;
-import org.opensha2.eq.fault.surface.GriddedSurface;
 import org.opensha2.eq.fault.surface.DefaultGriddedSurface;
+import org.opensha2.eq.fault.surface.GriddedSurface;
 import org.opensha2.eq.fault.surface.RuptureFloating;
 import org.opensha2.eq.fault.surface.RuptureScaling;
 import org.opensha2.geo.LocationList;
@@ -155,7 +153,6 @@ public class InterfaceSource extends FaultSource {
 					.width(width)
 					.spacing(spacing)
 					.build();
-
 			}
 
 			return new InterfaceSource(name, id, trace, lowerTrace, dip, width, surface, rake,
diff --git a/src/org/opensha2/eq/model/MfdHelper.java b/src/org/opensha2/eq/model/MfdHelper.java
index d93bec334..8fa8728e2 100644
--- a/src/org/opensha2/eq/model/MfdHelper.java
+++ b/src/org/opensha2/eq/model/MfdHelper.java
@@ -1,6 +1,17 @@
 package org.opensha2.eq.model;
 
-import static org.opensha2.eq.model.SourceAttribute.*;
+import static org.opensha2.eq.model.SourceAttribute.A;
+import static org.opensha2.eq.model.SourceAttribute.B;
+import static org.opensha2.eq.model.SourceAttribute.C_MAG;
+import static org.opensha2.eq.model.SourceAttribute.D_MAG;
+import static org.opensha2.eq.model.SourceAttribute.FLOATS;
+import static org.opensha2.eq.model.SourceAttribute.M;
+import static org.opensha2.eq.model.SourceAttribute.MAGS;
+import static org.opensha2.eq.model.SourceAttribute.M_MAX;
+import static org.opensha2.eq.model.SourceAttribute.M_MIN;
+import static org.opensha2.eq.model.SourceAttribute.RATE;
+import static org.opensha2.eq.model.SourceAttribute.RATES;
+import static org.opensha2.eq.model.SourceAttribute.WEIGHT;
 import static org.opensha2.util.Parsing.readBoolean;
 import static org.opensha2.util.Parsing.readDouble;
 import static org.opensha2.util.Parsing.readString;
@@ -70,7 +81,7 @@ class MfdHelper {
 
 	static class SingleData {
 
-		final double a;
+		final double rate;
 		final double m;
 		final boolean floats;
 		final double weight;
@@ -80,7 +91,7 @@ class MfdHelper {
 		 * for extra and unknown attributes.
 		 */
 		private SingleData(Attributes atts) {
-			a = readDouble(A, atts);
+			rate = readDouble(RATE, atts);
 			m = readDouble(M, atts);
 			floats = readBoolean(FLOATS, atts);
 			weight = readDouble(WEIGHT, atts);
@@ -93,7 +104,7 @@ class MfdHelper {
 		private SingleData(Attributes atts, SingleData ref) {
 
 			// set defaults locally
-			double a = ref.a;
+			double rate = ref.rate;
 			double m = ref.m;
 			boolean floats = ref.floats;
 			double weight = ref.weight;
@@ -101,8 +112,8 @@ class MfdHelper {
 			for (int i = 0; i < atts.getLength(); i++) {
 				SourceAttribute att = SourceAttribute.fromString(atts.getQName(i));
 				switch (att) {
-					case A:
-						a = readDouble(A, atts);
+					case RATE:
+						rate = readDouble(RATE, atts);
 						break;
 					case M:
 						m = readDouble(M, atts);
@@ -121,7 +132,7 @@ class MfdHelper {
 			}
 
 			// export final fields
-			this.a = a;
+			this.rate = rate;
 			this.m = m;
 			this.floats = floats;
 			this.weight = weight;
diff --git a/src/org/opensha2/eq/model/SourceAttribute.java b/src/org/opensha2/eq/model/SourceAttribute.java
index 9a3403c00..edaa17874 100644
--- a/src/org/opensha2/eq/model/SourceAttribute.java
+++ b/src/org/opensha2/eq/model/SourceAttribute.java
@@ -38,6 +38,7 @@ public enum SourceAttribute {
 	C_MAG,
 	FLOATS,
 	MAGS,
+	RATE,
 	RATES,
 	
 	/* Mag uncertainty specific */
diff --git a/src/org/opensha2/gmm/AtkinsonBoore_2003.java b/src/org/opensha2/gmm/AtkinsonBoore_2003.java
index d2e6d31f2..7a9ddbb19 100644
--- a/src/org/opensha2/gmm/AtkinsonBoore_2003.java
+++ b/src/org/opensha2/gmm/AtkinsonBoore_2003.java
@@ -17,8 +17,8 @@ import java.util.Map;
  * gridded 'deep' events in northern California and the Pacific Northwest. In
  * the 2014 NSHM, 'slab' implementations with Mw saturation at 7.8 were added.
  * 
- * <p><b>Note:</b> NSHM fortran implementations implement strict hypocentral depths
- * that are hardcoded into these implementations as well. FOr interface
+ * <p><b>Note:</b> NSHM fortran implementations implement strict hypocentral
+ * depths that are hardcoded into these implementations as well. FOr interface
  * 
  * <p><b>Note:</b> Direct instantiation of {@code GroundMotionModel}s is
  * prohibited. Use {@link Gmm#instance(Imt)} to retrieve an instance for a
@@ -82,7 +82,7 @@ public abstract class AtkinsonBoore_2003 implements GroundMotionModel {
 	AtkinsonBoore_2003(final Imt imt) {
 		coeffs = initCoeffs(imt, isSlab(), isGlobal());
 		coeffsPGA = initCoeffs(PGA, isSlab(), isGlobal());
-		mMax = saturationMagnitude(isSlab(), lowSaturationMw());
+		mMax = saturationMw();
 	}
 
 	private static Coefficients initCoeffs(final Imt imt, final boolean slab, final boolean global) {
@@ -102,9 +102,16 @@ public abstract class AtkinsonBoore_2003 implements GroundMotionModel {
 
 	// implementation flag
 	abstract boolean isSlab();
-	
-	// implementationFlag
-	abstract boolean lowSaturationMw();
+
+	// implementation value
+	// - interface events saturate at 8.5
+	// - slab events saturate at 8.0 in the 2008 NSHM
+	// - slab event saturation was reduced to 7.8 for 2014 NSHM
+	abstract double saturationMw();
+
+	private static final double SAT_MW_INTERFACE = 8.5;
+	private static final double SAT_MW_SLAB_2008 = 8.0;
+	private static final double SAT_MW_SLAB_2014 = 7.8;
 	
 	private static double saturationMagnitude(boolean slab, boolean lowSat) {
 		return !slab ? 8.5 : lowSat ? 7.8 : 8.0;
@@ -116,7 +123,7 @@ public abstract class AtkinsonBoore_2003 implements GroundMotionModel {
 
 		// "saturation effect" p. 1709 AB 2003
 		double Mw = Math.min(in.Mw, mMax);
-		
+
 		// TODO what is the reasoning behind the following?
 		// does zHyp yield unreliable results?
 
@@ -193,9 +200,9 @@ public abstract class AtkinsonBoore_2003 implements GroundMotionModel {
 
 		return gnd * BASE_10_TO_E - LN_G_CM_TO_M;
 	}
-	
+
 	static final class CascadiaInterface extends AtkinsonBoore_2003 {
-		static final String NAME = createName(false, false, false);
+		static final String NAME = createName(false, false, SAT_MW_INTERFACE);
 
 		CascadiaInterface(Imt imt) {
 			super(imt);
@@ -209,13 +216,13 @@ public abstract class AtkinsonBoore_2003 implements GroundMotionModel {
 			return false;
 		}
 
-		@Override boolean lowSaturationMw() {
-			return false;
+		@Override double saturationMw() {
+			return SAT_MW_INTERFACE;
 		}
 	}
 
 	static final class CascadiaSlab extends AtkinsonBoore_2003 {
-		static final String NAME = createName(false, true, false);
+		static final String NAME = createName(false, true, SAT_MW_SLAB_2008);
 
 		CascadiaSlab(Imt imt) {
 			super(imt);
@@ -228,14 +235,14 @@ public abstract class AtkinsonBoore_2003 implements GroundMotionModel {
 		@Override final boolean isSlab() {
 			return true;
 		}
-		
-		@Override boolean lowSaturationMw() {
-			return false;
+
+		@Override double saturationMw() {
+			return SAT_MW_SLAB_2008;
 		}
 	}
 
 	static final class CascadiaSlabLowMagSaturation extends AtkinsonBoore_2003 {
-		static final String NAME = createName(false, true, true);
+		static final String NAME = createName(false, true, SAT_MW_SLAB_2014);
 
 		CascadiaSlabLowMagSaturation(Imt imt) {
 			super(imt);
@@ -248,14 +255,14 @@ public abstract class AtkinsonBoore_2003 implements GroundMotionModel {
 		@Override final boolean isSlab() {
 			return true;
 		}
-		
-		@Override boolean lowSaturationMw() {
-			return true;
+
+		@Override double saturationMw() {
+			return SAT_MW_SLAB_2014;
 		}
 	}
 
 	static final class GlobalInterface extends AtkinsonBoore_2003 {
-		static final String NAME = createName(true, false, false);
+		static final String NAME = createName(true, false, SAT_MW_INTERFACE);
 
 		GlobalInterface(Imt imt) {
 			super(imt);
@@ -268,14 +275,14 @@ public abstract class AtkinsonBoore_2003 implements GroundMotionModel {
 		@Override final boolean isSlab() {
 			return false;
 		}
-		
-		@Override boolean lowSaturationMw() {
-			return false;
+
+		@Override double saturationMw() {
+			return SAT_MW_INTERFACE;
 		}
 	}
 
 	static final class GlobalSlab extends AtkinsonBoore_2003 {
-		static final String NAME = createName(true, true, false);
+		static final String NAME = createName(true, true, SAT_MW_SLAB_2008);
 
 		GlobalSlab(Imt imt) {
 			super(imt);
@@ -288,14 +295,14 @@ public abstract class AtkinsonBoore_2003 implements GroundMotionModel {
 		@Override final boolean isSlab() {
 			return true;
 		}
-		
-		@Override boolean lowSaturationMw() {
-			return false;
+
+		@Override double saturationMw() {
+			return SAT_MW_SLAB_2008;
 		}
 	}
 
 	static final class GlobalSlabLowMagSaturation extends AtkinsonBoore_2003 {
-		static final String NAME = createName(true, true, true);
+		static final String NAME = createName(true, true, SAT_MW_SLAB_2014);
 
 		GlobalSlabLowMagSaturation(Imt imt) {
 			super(imt);
@@ -308,20 +315,17 @@ public abstract class AtkinsonBoore_2003 implements GroundMotionModel {
 		@Override final boolean isSlab() {
 			return true;
 		}
-		
-		@Override boolean lowSaturationMw() {
-			return true;
+
+		@Override double saturationMw() {
+			return SAT_MW_SLAB_2014;
 		}
 	}
-	
-	static String createName(boolean global, boolean slab, boolean lowSat) {
+
+	static String createName(boolean global, boolean slab, double satMw) {
 		StringBuilder sb = new StringBuilder(AtkinsonBoore_2003.NAME);
-		sb.append(" : ");
-		sb.append(global ? "Global" : "Cascadia");
-		sb.append(" : ");
-		sb.append(slab ? "Slab" : "Interface");
-		sb.append(" : SatMw=");
-		sb.append(saturationMagnitude(slab, lowSat));
+		sb.append(" : ").append(global ? "Global" : "Cascadia");
+		sb.append(" : ").append(slab ? "Slab" : "Interface");
+		sb.append(" : SatMw=").append(satMw);
 		return sb.toString();
 	}
 
diff --git a/src/org/opensha2/gmm/Gmm.java b/src/org/opensha2/gmm/Gmm.java
index cddfd6599..e98a56499 100644
--- a/src/org/opensha2/gmm/Gmm.java
+++ b/src/org/opensha2/gmm/Gmm.java
@@ -96,7 +96,7 @@ public enum Gmm {
 			AtkinsonBoore_2003.COEFFS_GLOBAL_SLAB),
 
 	/** @see AtkinsonBoore_2003 */
-	AB_03_GLOB_SLAB_SAT_M7P8(AtkinsonBoore_2003.GlobalSlabLowMagSaturation.class,
+	AB_03_GLOB_SLAB_LOW_SAT(AtkinsonBoore_2003.GlobalSlabLowMagSaturation.class,
 			AtkinsonBoore_2003.GlobalSlabLowMagSaturation.NAME,
 			AtkinsonBoore_2003.COEFFS_GLOBAL_SLAB),
 
@@ -109,7 +109,7 @@ public enum Gmm {
 			AtkinsonBoore_2003.COEFFS_CASC_SLAB),
 
 	/** @see AtkinsonBoore_2003 */
-	AB_03_CASC_SLAB_SAT_M7P8(AtkinsonBoore_2003.CascadiaSlabLowMagSaturation.class,
+	AB_03_CASC_SLAB_LOW_SAT(AtkinsonBoore_2003.CascadiaSlabLowMagSaturation.class,
 			AtkinsonBoore_2003.CascadiaSlabLowMagSaturation.NAME,
 			AtkinsonBoore_2003.COEFFS_CASC_SLAB),
 
diff --git a/test/org/opensha2/gmm/SubSlab.java b/test/org/opensha2/gmm/SubSlab.java
index df47190ec..c3f526121 100644
--- a/test/org/opensha2/gmm/SubSlab.java
+++ b/test/org/opensha2/gmm/SubSlab.java
@@ -1,9 +1,9 @@
 package org.opensha2.gmm;
 
 import static org.opensha2.gmm.Gmm.AB_03_CASC_SLAB;
-import static org.opensha2.gmm.Gmm.AB_03_CASC_SLAB_SAT_M7P8;
+import static org.opensha2.gmm.Gmm.AB_03_CASC_SLAB_LOW_SAT;
 import static org.opensha2.gmm.Gmm.AB_03_GLOB_SLAB;
-import static org.opensha2.gmm.Gmm.AB_03_GLOB_SLAB_SAT_M7P8;
+import static org.opensha2.gmm.Gmm.AB_03_GLOB_SLAB_LOW_SAT;
 import static org.opensha2.gmm.Gmm.BCHYDRO_12_SLAB;
 import static org.opensha2.gmm.Gmm.YOUNGS_97_SLAB;
 import static org.opensha2.gmm.Gmm.ZHAO_06_SLAB;
@@ -49,9 +49,9 @@ public class SubSlab extends GmmTest {
 	/* Result generation sets */
 	private static Set<Gmm> gmms = EnumSet.of(
 		AB_03_GLOB_SLAB,
-		AB_03_GLOB_SLAB_SAT_M7P8,
+		AB_03_GLOB_SLAB_LOW_SAT,
 		AB_03_CASC_SLAB,
-		AB_03_CASC_SLAB_SAT_M7P8,
+		AB_03_CASC_SLAB_LOW_SAT,
 		BCHYDRO_12_SLAB,
 		BCHYDRO_12_SLAB,
 		YOUNGS_97_SLAB,
-- 
GitLab