From fb44aa84851b1f6a43842538bd0f9ad3ee4cd960 Mon Sep 17 00:00:00 2001
From: Jason Altekruse <jaltekruse@usgs.gov>
Date: Fri, 26 Jul 2024 14:31:05 -0600
Subject: [PATCH] rough framework for PRVI background GMC models based on
 CombinedGmm. Coefficients inplace but unused. See ghsc/nshmp/nshmp-lib#251

---
 .../earthquake/nshmp/gmm/PrviBackbone.java    | 210 ++++++++++++++++++
 .../prvi-25-backbone-adjustment_coeffs.csv    |  24 ++
 .../prvi-25-backbone-phiS2S_crustal.csv       |  23 ++
 .../coeffs/prvi-25-backbone-phiSS_crustal.csv |  21 ++
 .../prvi-25-backbone-sigma_subduction.csv     |  22 ++
 .../coeffs/prvi-25-backbone-tau_crustal.csv   |  23 ++
 6 files changed, 323 insertions(+)
 create mode 100644 src/main/java/gov/usgs/earthquake/nshmp/gmm/PrviBackbone.java
 create mode 100644 src/main/resources/gmm/coeffs/prvi-25-backbone-adjustment_coeffs.csv
 create mode 100644 src/main/resources/gmm/coeffs/prvi-25-backbone-phiS2S_crustal.csv
 create mode 100644 src/main/resources/gmm/coeffs/prvi-25-backbone-phiSS_crustal.csv
 create mode 100644 src/main/resources/gmm/coeffs/prvi-25-backbone-sigma_subduction.csv
 create mode 100644 src/main/resources/gmm/coeffs/prvi-25-backbone-tau_crustal.csv

diff --git a/src/main/java/gov/usgs/earthquake/nshmp/gmm/PrviBackbone.java b/src/main/java/gov/usgs/earthquake/nshmp/gmm/PrviBackbone.java
new file mode 100644
index 00000000..b7e6b9a3
--- /dev/null
+++ b/src/main/java/gov/usgs/earthquake/nshmp/gmm/PrviBackbone.java
@@ -0,0 +1,210 @@
+package gov.usgs.earthquake.nshmp.gmm;
+
+import static gov.usgs.earthquake.nshmp.gmm.Gmm.AG_20_GLOBAL_INTERFACE;
+import static gov.usgs.earthquake.nshmp.gmm.Gmm.AG_20_GLOBAL_SLAB;
+import static gov.usgs.earthquake.nshmp.gmm.Gmm.ASK_14;
+import static gov.usgs.earthquake.nshmp.gmm.Gmm.BSSA_14;
+import static gov.usgs.earthquake.nshmp.gmm.Gmm.CB_14;
+import static gov.usgs.earthquake.nshmp.gmm.Gmm.CY_14;
+import static gov.usgs.earthquake.nshmp.gmm.Gmm.KBCG_20_GLOBAL_INTERFACE;
+import static gov.usgs.earthquake.nshmp.gmm.Gmm.KBCG_20_GLOBAL_SLAB;
+import static gov.usgs.earthquake.nshmp.gmm.Gmm.MA_05;
+import static gov.usgs.earthquake.nshmp.gmm.Gmm.PSBAH_20_GLOBAL_INTERFACE;
+import static gov.usgs.earthquake.nshmp.gmm.Gmm.PSBAH_20_GLOBAL_SLAB;
+
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.stream.Collectors;
+
+import gov.usgs.earthquake.nshmp.data.DoubleData;
+import gov.usgs.earthquake.nshmp.gmm.GmmInput.Constraints;
+import gov.usgs.earthquake.nshmp.tree.LogicTree;
+
+/*
+ *
+ */
+
+/**
+ * PRVI GMC class for backbone GMM implementations.
+ *
+ * Copied from CombinedGmm:
+ *
+ * Convenience class for combined GMM implementations that compute weight
+ * averaged ground motions and sigmas for a logic tree of ground motion models.
+ * These are NOT intended for use in hazard calculations, but are made available
+ * to support comparative deterministic analysis of GMM logic trees.
+ */
+class PrviBackbone implements GroundMotionModel {
+
+  private static final String NAME = "PRVI Backbone: ";
+
+  static final CoefficientContainer COEFFS_PHIS2S_ACTIVE_CRUST =
+      new CoefficientContainer("prvi-25-backbone-phiS2S_crustal.csv");
+  static final CoefficientContainer COEFFS_PHISS_ACTIVE_CRUST =
+      new CoefficientContainer("prvi-25-backbone-phiSS_crustal.csv");
+  static final CoefficientContainer COEFFS_SIGMA_SUBDUCTION =
+      new CoefficientContainer("prvi-25-backbone-sigma_subduction.csv");
+  static final CoefficientContainer COEFFS_TAU_ACTIVE_CRUST =
+      new CoefficientContainer("prvi-25-backbone-tau_crustal.csv");
+
+  /*
+   * Bias adjustmnet coefficients from https://github.com/gem/oq-engine/blob/
+   * 576bf0c6853ca896aae84e68ad848d39de09a396/openquake/hazardlib/gsim/usgs_prvi
+   * .py last updated Jun 25, 2024
+   */
+  static final CoefficientContainer COEFFS_BIAS_ADJUSTMENT =
+      new CoefficientContainer("prvi-25-backbone-adjustment_coeffs.csv");
+  private final double ACTIVE_CRUSTAL_MEAN_ADJUSTMENT = -0.371;
+  private final double SUBDUCTION_INTERFACE_MEAN_ADJUSTMENT = -1.098;
+  private final double SUBDUCTION_INTRASLAB_MEAN_ADJUSTMENT = -0.405;
+
+  private final Map<Gmm, Double> gmms;
+  private final Imt imt;
+
+  /* Supply map of ground motion models initialized to the required IMT. */
+  private PrviBackbone(Imt imt, Map<Gmm, Double> gmms) {
+    this.gmms = gmms;
+    this.imt = imt;
+
+    double[] weights = gmms.values().stream()
+        .mapToDouble(Double::doubleValue)
+        .toArray();
+    DoubleData.checkWeightSum(weights);
+  }
+
+  @Override
+  public Imt imt() {
+    return imt;
+  }
+
+  @Override
+  public LogicTree<GroundMotion> calc(GmmInput in) {
+
+    LogicTree.Builder<GroundMotion> builder = LogicTree.builder(NAME);
+    gmms.keySet().forEach(key -> builder.addBranch(
+        key.name(),
+        GroundMotions.combine(key.instance(imt).calc(in)),
+        gmms.get(key)));
+    return builder.build();
+  }
+
+  static Map<Gmm, GroundMotionModel> instancesForImt(
+      Imt imt,
+      Map<Gmm, Double> gmms) {
+
+    return gmms.entrySet().stream()
+        .collect(Collectors.toMap(
+            Entry::getKey,
+            entry -> entry.getKey().instance(imt)));
+  }
+
+  /*
+   * Implementations. For each, coefficients are only used to get the set of
+   * supported IMTs and therefore reference a model that supports the
+   * intersection of all support IMTs.
+   */
+
+  /* PRVI 2025 Active Crust */
+
+  /* This will eventually include NGA-W2 PRVI adjusted flavors */
+  static final Map<Gmm, Double> PRVI_2025_ACTIVE_CRUST = Map.of(
+      ASK_14, 0.22,
+      BSSA_14, 0.22,
+      CB_14, 0.22,
+      CY_14, 0.22,
+      MA_05, 0.12);
+
+  static final class Prvi2025ActiveCrust extends PrviBackbone {
+
+    static final String NAME = PrviBackbone.NAME + "Active crust 2025";
+    /* may need to use MA05 constraints? */
+    static final Constraints CONSTRAINTS = AbrahamsonEtAl_2014.CONSTRAINTS;
+    static final CoefficientContainer COEFFS = AbrahamsonEtAl_2014.COEFFS;
+
+    Prvi2025ActiveCrust(Imt imt) {
+      super(imt, PRVI_2025_ACTIVE_CRUST);
+    }
+
+  }
+
+  /* PRVI 2025 Subduction Interface */
+
+  /* This will eventually include NGA-Sub PRVI adjusted flavors */
+  static final Map<Gmm, Double> PRVI_2025_INTERFACE = Map.of(
+      AG_20_GLOBAL_INTERFACE, 0.2924,
+      KBCG_20_GLOBAL_INTERFACE, 0.2838,
+      PSBAH_20_GLOBAL_INTERFACE, 0.2838,
+      MA_05, 0.14);
+
+  static final class Prvi2025Interface extends PrviBackbone {
+
+    static final String NAME = PrviBackbone.NAME + "Interface 2025";
+    /* may need to use MA05 constraints? */
+    static final Constraints CONSTRAINTS = AbrahamsonGulerce_2020.CONSTRAINTS_INTERFACE;
+    static final CoefficientContainer COEFFS = AbrahamsonGulerce_2020.COEFFS;
+
+    Prvi2025Interface(Imt imt) {
+      super(imt, PRVI_2025_INTERFACE);
+    }
+
+  }
+
+  /* PRVI 2025 Subduction Intraslab */
+
+  /* This will eventually include NGA-Sub PRVI adjusted flavors */
+  static final Map<Gmm, Double> PRVI_2025_INTRASLAB = Map.of(
+      AG_20_GLOBAL_SLAB, 0.2924,
+      KBCG_20_GLOBAL_SLAB, 0.2838,
+      PSBAH_20_GLOBAL_SLAB, 0.2838,
+      MA_05, 0.14);
+
+  static final class Prvi2025Slab extends PrviBackbone {
+
+    static final String NAME = PrviBackbone.NAME + "Interface 2025";
+    /* may need to use MA05 constraints? */
+    static final Constraints CONSTRAINTS = AbrahamsonGulerce_2020.CONSTRAINTS_SLAB;
+    static final CoefficientContainer COEFFS = AbrahamsonGulerce_2020.COEFFS;
+
+    Prvi2025Slab(Imt imt) {
+      super(imt, PRVI_2025_INTRASLAB);
+    }
+
+  }
+
+  // static final Map<Gmm, Double> STABLE_CRUST_2014 = Map.of(
+  // AB_06_PRIME, 0.22,
+  // ATKINSON_08_PRIME, 0.08,
+  // CAMPBELL_03, 0.11,
+  // FRANKEL_96, 0.06,
+  // PEZESHK_11, 0.15,
+  // SILVA_02, 0.06,
+  // SOMERVILLE_01, 0.1,
+  // TP_05, 0.11,
+  // TORO_97_MW, 0.11);
+  //
+  // /* Need to allow Vs30=3000 through for comparison plots. */
+  // private static final Constraints STABLE_2014_CONSTRAINTS =
+  // Constraints.builder()
+  // .withDefaults()
+  // .build();
+  //
+  // /* 4.0 Fault variant that includes Somerville. */
+  // static final class StableCrust2014 extends PrviBackbone {
+  //
+  // static final String NAME = PrviBackbone.NAME + "Stable crust 2014 (4.*)";
+  // static final Constraints CONSTRAINTS = STABLE_2014_CONSTRAINTS;
+  // static final CoefficientContainer COEFFS = FrankelEtAl_1996.COEFFS;
+  //
+  // StableCrust2014(Imt imt) {
+  // super(imt, STABLE_CRUST_2014);
+  // }
+  //
+  // @Override
+  // public LogicTree<GroundMotion> calc(GmmInput in) {
+  // GmmInput.Builder b = GmmInput.builder().fromCopy(in);
+  // b.vs30(in.vs30 <= 760.0 ? 760.0 : 2000.0);
+  // return super.calc(b.build());
+  // }
+  // }
+
+}
diff --git a/src/main/resources/gmm/coeffs/prvi-25-backbone-adjustment_coeffs.csv b/src/main/resources/gmm/coeffs/prvi-25-backbone-adjustment_coeffs.csv
new file mode 100644
index 00000000..bb615408
--- /dev/null
+++ b/src/main/resources/gmm/coeffs/prvi-25-backbone-adjustment_coeffs.csv
@@ -0,0 +1,24 @@
+imt,   bias_active_crust,bias_interface,bias_intraslab
+pgv,              -0.452,        -1.189,        -0.476
+pga,              -0.329,        -0.888,        -0.376
+0.010,            -0.329,        -0.888,        -0.376
+0.020,            -0.301,        -0.804,        -0.239
+0.030,            -0.274,        -0.720,        -0.103
+0.050,            -0.246,        -0.637,         0.034
+0.075,            -0.155,        -0.621,        -0.044
+0.100,            -0.188,        -0.601,        -0.234
+0.150,            -0.142,        -0.575,        -0.016
+0.200,            -0.132,        -0.839,        -0.241
+0.250,            -0.195,        -0.852,        -0.234
+0.300,            -0.289,        -0.971,        -0.302
+0.400,            -0.470,        -1.250,        -0.428
+0.500,            -0.598,        -1.424,        -0.570
+0.750,            -0.679,        -1.636,        -0.757
+1.000,            -0.661,        -1.692,        -0.837
+1.500,            -0.588,        -1.658,        -0.849
+2.000,            -0.483,        -1.512,        -0.780
+3.000,            -0.319,        -1.256,        -0.466
+4.000,            -0.171,        -1.123,        -0.282
+5.000,             0.001,        -0.985,        -0.056
+7.500,             0.258,        -0.776,         0.289
+10.000,            0.426,        -0.639,         0.640
diff --git a/src/main/resources/gmm/coeffs/prvi-25-backbone-phiS2S_crustal.csv b/src/main/resources/gmm/coeffs/prvi-25-backbone-phiS2S_crustal.csv
new file mode 100644
index 00000000..14435137
--- /dev/null
+++ b/src/main/resources/gmm/coeffs/prvi-25-backbone-phiS2S_crustal.csv
@@ -0,0 +1,23 @@
+Period,phiS2S_PRVI,phiS2S_WUS
+0,0.5048,0.4324
+-1,0.5145,0.3234
+0.01,0.4584,0.4584
+0.03,0.4898,0.4835
+0.05,0.5387,0.5316
+0.075,0.562,0.5316
+0.1,0.5639,0.5178
+0.15,0.57,0.4843
+0.2,0.5882,0.4459
+0.25,0.5977,0.427
+0.3,0.6149,0.4265
+0.4,0.6058,0.419
+0.5,0.5984,0.4124
+0.75,0.5697,0.3999
+1,0.5533,0.3887
+1.5,0.5365,0.3699
+2,0.5157,0.3653
+3,0.4926,0.3533
+4,0.4521,0.3099
+5,0.388,0.2869
+7.5,0.3352,0.2479
+10,0.3065,0.2411
\ No newline at end of file
diff --git a/src/main/resources/gmm/coeffs/prvi-25-backbone-phiSS_crustal.csv b/src/main/resources/gmm/coeffs/prvi-25-backbone-phiSS_crustal.csv
new file mode 100644
index 00000000..3fa60f4e
--- /dev/null
+++ b/src/main/resources/gmm/coeffs/prvi-25-backbone-phiSS_crustal.csv
@@ -0,0 +1,21 @@
+Period,a_smoothed_Mod,b_smoothed_Mod
+PGA,0.540640202,0.386376858
+PGV,0.499519534,0.380282042
+0.05,0.5819,0.4628
+0.075,0.5696,0.4411
+0.1,0.5609,0.4257
+0.15,0.548,0.4064
+0.2,0.5384,0.3965
+0.25,0.5284,0.3921
+0.3,0.5193,0.3898
+0.4,0.501,0.3903
+0.5,0.4868,0.3933
+0.75,0.4626,0.4021
+1,0.4474,0.4091
+1.5,0.4281,0.4222
+2,0.4163,0.4303
+3,0.4004,0.4392
+4,0.3893,0.4429
+5,0.3809,0.4462
+7.5,0.3809,0.4462
+10,0.3809,0.4462
\ No newline at end of file
diff --git a/src/main/resources/gmm/coeffs/prvi-25-backbone-sigma_subduction.csv b/src/main/resources/gmm/coeffs/prvi-25-backbone-sigma_subduction.csv
new file mode 100644
index 00000000..b600bc9b
--- /dev/null
+++ b/src/main/resources/gmm/coeffs/prvi-25-backbone-sigma_subduction.csv
@@ -0,0 +1,22 @@
+Period,tau_mean,tau_std,phi_mean,phi_std,phiS2S_PRVI_smooth,PhiSS_PRVI
+0,0.479347621,0.009739968,0.598170778,0.02997973,0.552964521,0.4004648
+0.01,0.479842621,0.012902603,0.599715795,0.030303845,0.446973433,0.3998422
+0.03,0.493538176,0.022081608,0.605414935,0.036753258,0.44793982,0.4072802
+0.05,0.503854662,0.031839856,0.631310952,0.060074574,0.629899124,0.4241193
+0.075,0.504058824,0.032717326,0.653747051,0.080479805,0.68,0.4410622
+0.1,0.501173533,0.029736822,0.655148044,0.078122227,0.68,0.4315106
+0.15,0.49476189,0.022620488,0.64094506,0.062245152,0.68,0.4203688
+0.2,0.490358667,0.017637175,0.630669594,0.052595294,0.68,0.4179791
+0.25,0.485948667,0.013945175,0.630145369,0.053089858,0.68,0.4264706
+0.3,0.484869667,0.012881109,0.622059224,0.046648008,0.68,0.4121533
+0.4,0.483405,0.011762316,0.614476689,0.043975814,0.657122376,0.4107348
+0.5,0.482535667,0.011317014,0.609189267,0.042376627,0.644880694,0.4090946
+0.75,0.481619667,0.011052238,0.611396245,0.051666323,0.525025627,0.4263615
+1,0.481443,0.011026729,0.608267188,0.043578342,0.468820729,0.4497699
+1.5,0.481616667,0.011051734,0.602432298,0.04009045,0.457330147,0.4452342
+2,0.481845333,0.011097016,0.597930129,0.04217366,0.453647932,0.4357686
+3,0.482007333,0.011137511,0.584227817,0.040429542,0.419342626,0.4183968
+4,0.481866667,0.011101952,0.563798176,0.030737473,0.394558646,0.4050549
+5,0.481576667,0.011045254,0.543496594,0.019912505,0.400973701,0.3668905
+7.5,0.480675,0.011014394,0.504608851,0.004035643,0.372561829,0.3403348
+10,0.479827667,0.011185844,0.478000865,0.023421479,0.340296661,0.3356829
diff --git a/src/main/resources/gmm/coeffs/prvi-25-backbone-tau_crustal.csv b/src/main/resources/gmm/coeffs/prvi-25-backbone-tau_crustal.csv
new file mode 100644
index 00000000..de58c991
--- /dev/null
+++ b/src/main/resources/gmm/coeffs/prvi-25-backbone-tau_crustal.csv
@@ -0,0 +1,23 @@
+IMT,tau_mean_4.5,tau_mean_5.0,tau_mean_5.5,tau_mean_6.5,tau_std_4.5,tau_std_5.0,tau_std_5.5,tau_std_6.5
+PGV,0.371847647,0.362467907,0.342116181,0.320160387,0.032528217,0.032517612,0.029567509,0.046619399
+PGA,0.419205954,0.402030359,0.366279689,0.328964389,0.029610719,0.041294073,0.045613754,0.046548211
+0.01,0.418955954,0.401905359,0.366279689,0.328964389,0.029502775,0.041432295,0.045225616,0.046155876
+0.03,0.441763181,0.418818413,0.377500673,0.340510829,0.022824136,0.029859767,0.038304869,0.044522172
+0.05,0.425023093,0.415931843,0.388847189,0.352562972,0.033520951,0.034372105,0.031384833,0.041511097
+0.075,0.425023093,0.415931843,0.388847189,0.352562972,0.033520951,0.034372105,0.031384833,0.041511097
+0.1,0.425023093,0.415931843,0.388847189,0.352562972,0.033520951,0.034372105,0.031384833,0.041511097
+0.15,0.408283004,0.413045272,0.400193705,0.364615116,0.044217766,0.038884443,0.024464797,0.038500021
+0.2,0.396042097,0.391488792,0.369504043,0.334518881,0.056271237,0.060730881,0.050850552,0.033270940
+0.25,0.398499409,0.384956151,0.354080709,0.319321610,0.055106334,0.068532537,0.067916844,0.043690903
+0.3,0.402305030,0.380520252,0.341485367,0.306911978,0.052819609,0.073993237,0.082737988,0.056192580
+0.4,0.411637078,0.378738821,0.328697786,0.294364906,0.045330405,0.076923368,0.094959396,0.065536140
+0.5,0.425216085,0.387449778,0.332632992,0.298497075,0.034096258,0.069186584,0.091377049,0.061587354
+0.75,0.450721198,0.413839025,0.360043251,0.326195708,0.014695700,0.045285090,0.068710017,0.042961061
+1.0,0.471598007,0.431969101,0.375520059,0.341865603,0.017611714,0.028672429,0.054990455,0.032776350
+1.5,0.485873644,0.447370830,0.392156557,0.358718813,0.027787409,0.017878409,0.047257849,0.035371463
+2.0,0.488597542,0.450842264,0.396447076,0.363130735,0.029905736,0.014044687,0.041835728,0.031036041
+3.0,0.490698230,0.456194032,0.405142354,0.372009813,0.031133479,0.010516648,0.036799592,0.032027136
+4.0,0.503349794,0.460349286,0.400848047,0.367841311,0.039899704,0.009569311,0.034678120,0.022633905
+5.0,0.498600000,0.459850000,0.404650000,0.371750000,0.034650830,0.016665608,0.041200030,0.034721211
+7.5,0.491025000,0.450275000,0.393133333,0.360350000,0.026550930,0.035256941,0.071496702,0.061519448
+10.0,0.471050000,0.436550000,0.385691667,0.352975000,0.009721497,0.042938415,0.084990697,0.073216473
-- 
GitLab