From 1460a81c74756c4531d450ce414223b17be1bc86 Mon Sep 17 00:00:00 2001
From: Peter Powers <pmpowers@usgs.gov>
Date: Thu, 7 Mar 2024 09:34:03 -0700
Subject: [PATCH] updated gid table to use fixed focal mech maps

---
 .../earthquake/nshmp/calc/HazardCalcs.java    |  6 ++-
 .../nshmp/model/GridRuptureSet.java           | 53 +++++++++++++++----
 2 files changed, 46 insertions(+), 13 deletions(-)

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 37a72c59..ee47a2ce 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 16a2f45a..c6a71886 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()));
-- 
GitLab