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