diff --git a/src/main/java/gov/usgs/earthquake/nshmp/calc/HazardCalcs.java b/src/main/java/gov/usgs/earthquake/nshmp/calc/HazardCalcs.java index 37a72c5986e21e507139673ae8886a45792b09bb..ee47a2ceff2386fd00604fc705d8fc7f2c2fbe16 100644 --- a/src/main/java/gov/usgs/earthquake/nshmp/calc/HazardCalcs.java +++ b/src/main/java/gov/usgs/earthquake/nshmp/calc/HazardCalcs.java @@ -146,7 +146,8 @@ public class HazardCalcs { immediateFuture(gss), GridRuptureSet.optimizer( site.location(), - config.performance.smoothGrids)::apply, + config.performance.smoothGrids, + config.hazard.gridFocalMechUpdate)::apply, ex)); break; } @@ -214,7 +215,8 @@ public class HazardCalcs { if (config.performance.optimizeGrids && gss.optimizable()) { ruptures = GridRuptureSet.optimizer( site.location(), - config.performance.smoothGrids).apply(gss); + config.performance.smoothGrids, + config.hazard.gridFocalMechUpdate).apply(gss); log(log, MSSG_GRID_INIT, ruptures.name(), duration(swSource)); } curveSets.add(sourcesToCurves(ruptures, site, config)); diff --git a/src/main/java/gov/usgs/earthquake/nshmp/model/GridRuptureSet.java b/src/main/java/gov/usgs/earthquake/nshmp/model/GridRuptureSet.java index 16a2f45a163b0c350125a66edc166d5abffb83a2..c6a718862370778c06f16ca70bb36f6e4a82e672 100644 --- a/src/main/java/gov/usgs/earthquake/nshmp/model/GridRuptureSet.java +++ b/src/main/java/gov/usgs/earthquake/nshmp/model/GridRuptureSet.java @@ -246,7 +246,7 @@ public class GridRuptureSet extends AbstractRuptureSet<PointSource> { static class Builder extends AbstractRuptureSet.Builder { private SourceFeature feature; // Grid or Zone - private ModelData data; + private ModelData data; // unused; clean private List<Location> locations; private List<Mfd> mfds; @@ -629,8 +629,8 @@ public class GridRuptureSet extends AbstractRuptureSet<PointSource> { * @param loc reference point for table */ public static Function<GridRuptureSet, RuptureSet<? extends Source>> optimizer( - Location loc, boolean smooth) { - return new Optimizer(loc, smooth); + Location loc, boolean smooth, boolean focalMechUpdate) { + return new Optimizer(loc, smooth, focalMechUpdate); } private static class Optimizer implements @@ -638,15 +638,17 @@ public class GridRuptureSet extends AbstractRuptureSet<PointSource> { private final Location loc; private final boolean smooth; + private final boolean focalMechUpdate; - Optimizer(Location loc, boolean smooth) { + Optimizer(Location loc, boolean smooth, boolean focalMechUpdate) { this.loc = loc; this.smooth = smooth; + this.focalMechUpdate = focalMechUpdate; } @Override public Table apply(GridRuptureSet sources) { - return new Table(sources, loc, smooth); + return new Table(sources, loc, smooth, focalMechUpdate); } } @@ -680,6 +682,24 @@ public class GridRuptureSet extends AbstractRuptureSet<PointSource> { */ private static final class Table extends AbstractRuptureSet<PointSource> { + private static final Map<FocalMech, Double> SS_MECH_MAP = new EnumMap<>(FocalMech.class); + private static final Map<FocalMech, Double> R_MECH_MAP = new EnumMap<>(FocalMech.class); + private static final Map<FocalMech, Double> N_MECH_MAP = new EnumMap<>(FocalMech.class); + + static { + SS_MECH_MAP.put(FocalMech.STRIKE_SLIP, 1.0); + SS_MECH_MAP.put(FocalMech.REVERSE, 0.0); + SS_MECH_MAP.put(FocalMech.NORMAL, 0.0); + + R_MECH_MAP.put(FocalMech.STRIKE_SLIP, 0.0); + R_MECH_MAP.put(FocalMech.REVERSE, 1.0); + R_MECH_MAP.put(FocalMech.NORMAL, 0.0); + + N_MECH_MAP.put(FocalMech.STRIKE_SLIP, 0.0); + N_MECH_MAP.put(FocalMech.REVERSE, 0.0); + N_MECH_MAP.put(FocalMech.NORMAL, 1.0); + } + private final GridRuptureSet parent; private final Location origin; private final List<PointSource> sources; @@ -695,7 +715,11 @@ public class GridRuptureSet extends AbstractRuptureSet<PointSource> { private int maximumSize; private int parentCount; - private Table(GridRuptureSet parent, Location origin, boolean smoothed) { + private Table( + GridRuptureSet parent, + Location origin, + boolean smoothed, + boolean focalMechUpdate) { // This is dirty - arose from conversion to ass constructor taking // builder @@ -713,7 +737,7 @@ public class GridRuptureSet extends AbstractRuptureSet<PointSource> { this.origin = origin; this.sources = parent.singularMechs ? initSources(smoothed) - : initMultiMechSources(smoothed); + : initMultiMechSources(smoothed, focalMechUpdate); } /** @@ -840,7 +864,9 @@ public class GridRuptureSet extends AbstractRuptureSet<PointSource> { } /* always creates finite point sources */ - private List<PointSource> initMultiMechSources(boolean smoothed) { + private List<PointSource> initMultiMechSources( + boolean smoothed, + boolean focalMechUpdate) { /* For now, should only be getting here for GR MFDs */ Mfd modelMfd = parent.mfds.get(0); @@ -910,6 +936,10 @@ public class GridRuptureSet extends AbstractRuptureSet<PointSource> { // System.out.println("tableMfd:"); // System.out.println(tableMfdSum); + Map<FocalMech, Double> ssMechMap = focalMechUpdate ? SS_MECH_MAP : parent.mechMaps.get(0); + Map<FocalMech, Double> rMechMap = focalMechUpdate ? R_MECH_MAP : parent.mechMaps.get(0); + Map<FocalMech, Double> nMechMap = focalMechUpdate ? N_MECH_MAP : parent.mechMaps.get(0); + List<Double> distances = ssTable.rows(); maximumSize = distances.size(); List<PointSource> b = new ArrayList<>(); @@ -919,12 +949,13 @@ public class GridRuptureSet extends AbstractRuptureSet<PointSource> { Mfd ssMfd = Mfd.create(ssTable.row(r)); if (ssMfd.data().y(0) > 0.0 || !ssMfd.data().isClear()) { + b.add(new PointSourceFinite( parent, parent.type(), loc, ssMfd, - parent.mechMaps.get(0), + ssMechMap, parent.rupScaling, parent.depthModel, Optional.empty())); @@ -938,7 +969,7 @@ public class GridRuptureSet extends AbstractRuptureSet<PointSource> { parent.type(), loc, rMfd, - parent.mechMaps.get(0), + rMechMap, parent.rupScaling, parent.depthModel, Optional.empty())); @@ -952,7 +983,7 @@ public class GridRuptureSet extends AbstractRuptureSet<PointSource> { parent.type(), loc, nMfd, - parent.mechMaps.get(0), + nMechMap, parent.rupScaling, parent.depthModel, Optional.empty()));