From e985183ee3afaf33b8f9a4865ac3f9e66249034d Mon Sep 17 00:00:00 2001 From: Peter Powers <pmpowers@usgs.gov> Date: Fri, 4 Feb 2022 13:50:17 -0700 Subject: [PATCH] applied sigma scaling in gm2curves --- .../earthquake/nshmp/calc/CalcConfig.java | 16 +++++++-------- .../nshmp/calc/ExceedanceModel.java | 6 ++++-- .../earthquake/nshmp/calc/Transforms.java | 20 +++++++++---------- .../usgs/earthquake/nshmp/model/Distance.java | 9 --------- .../resources/calc/calc-config-defaults.json | 2 +- .../nshmp/calc/CalcConfigTests.java | 4 ++-- .../resources/calc/calc-config-extends.json | 2 +- 7 files changed, 26 insertions(+), 33 deletions(-) diff --git a/src/main/java/gov/usgs/earthquake/nshmp/calc/CalcConfig.java b/src/main/java/gov/usgs/earthquake/nshmp/calc/CalcConfig.java index 7ec631bf..48daad71 100644 --- a/src/main/java/gov/usgs/earthquake/nshmp/calc/CalcConfig.java +++ b/src/main/java/gov/usgs/earthquake/nshmp/calc/CalcConfig.java @@ -233,7 +233,7 @@ public final class CalcConfig { * <p><b>Default:</b> 1.0<br><b>Range:</b> {@code 0.5} to {@code 1.0} (50% * to 100%, no scaling) */ - public final double gmmSigmaScaling; + public final double gmmSigmaScale; /** * The value format for hazard curves. @@ -256,7 +256,7 @@ public final class CalcConfig { this.sourceTypes = b.sourceTypes; this.vs30s = b.vs30s; this.gmmDampingRatio = b.gmmDampingRatio; - this.gmmSigmaScaling = b.gmmSigmaScaling; + this.gmmSigmaScale = b.gmmSigmaScale; this.valueFormat = b.valueFormat; this.customImls = b.customImls; @@ -298,7 +298,7 @@ public final class CalcConfig { Set<SourceType> sourceTypes; Set<Double> vs30s; Double gmmDampingRatio; - Double gmmSigmaScaling; + Double gmmSigmaScale; ValueFormat valueFormat; Map<Imt, double[]> customImls; Map<Imt, XySequence> curveMap; @@ -317,11 +317,11 @@ public final class CalcConfig { RezaeianDamping_2014.DAMPING_RATIO_RANGE, "gmmDampingRatio", gmmDampingRatio); - checkNotNull(gmmSigmaScaling); + checkNotNull(gmmSigmaScale); checkInRange( Range.closed(0.5, 1.0), "gmmSigmaScaling", - gmmSigmaScaling); + gmmSigmaScale); checkNotNull(valueFormat); checkNotNull(customImls); return new Hazard(this); @@ -335,7 +335,7 @@ public final class CalcConfig { this.sourceTypes = that.sourceTypes; this.vs30s = that.vs30s; this.gmmDampingRatio = that.gmmDampingRatio; - this.gmmSigmaScaling = that.gmmSigmaScaling; + this.gmmSigmaScale = that.gmmSigmaScale; this.valueFormat = that.valueFormat; this.customImls = that.customImls; } @@ -362,8 +362,8 @@ public final class CalcConfig { if (that.gmmDampingRatio != null) { this.gmmDampingRatio = that.gmmDampingRatio; } - if (that.gmmSigmaScaling != null) { - this.gmmSigmaScaling = that.gmmSigmaScaling; + if (that.gmmSigmaScale != null) { + this.gmmSigmaScale = that.gmmSigmaScale; } if (that.valueFormat != null) { this.valueFormat = that.valueFormat; diff --git a/src/main/java/gov/usgs/earthquake/nshmp/calc/ExceedanceModel.java b/src/main/java/gov/usgs/earthquake/nshmp/calc/ExceedanceModel.java index 2921bcff..63bf9a35 100644 --- a/src/main/java/gov/usgs/earthquake/nshmp/calc/ExceedanceModel.java +++ b/src/main/java/gov/usgs/earthquake/nshmp/calc/ExceedanceModel.java @@ -301,13 +301,14 @@ public enum ExceedanceModel { LogicTree<MutableXySequence> treeExceedance( LogicTree<GroundMotion> gmTree, double n, + double σScale, Imt imt, MutableXySequence sequence) { return Trees.transform( gmTree, gm -> exceedance( - gm.mean(), gm.sigma(), n, imt, + gm.mean(), gm.sigma() * σScale, n, imt, MutableXySequence.emptyCopyOf(sequence)), Optional.of(TREE_NAME)); } @@ -319,6 +320,7 @@ public enum ExceedanceModel { XySequence treeExceedanceCombined( LogicTree<GroundMotion> gmTree, double n, + double σScale, Imt imt, MutableXySequence sequence) { @@ -327,7 +329,7 @@ public enum ExceedanceModel { for (Branch<GroundMotion> branch : gmTree) { GroundMotion gm = branch.value(); - exceedance(gm.mean(), gm.sigma(), n, imt, branchCurve); + exceedance(gm.mean(), gm.sigma() * σScale, n, imt, branchCurve); sequence.add(branchCurve.multiply(branch.weight())); } return sequence; diff --git a/src/main/java/gov/usgs/earthquake/nshmp/calc/Transforms.java b/src/main/java/gov/usgs/earthquake/nshmp/calc/Transforms.java index 8e9988b8..27aecac8 100644 --- a/src/main/java/gov/usgs/earthquake/nshmp/calc/Transforms.java +++ b/src/main/java/gov/usgs/earthquake/nshmp/calc/Transforms.java @@ -157,11 +157,13 @@ final class Transforms { private final Map<Imt, XySequence> modelCurves; private final ExceedanceModel exceedanceModel; private final double truncationLevel; + private final double σScale; GroundMotionsToCurves(CalcConfig config) { this.modelCurves = config.hazard.logModelCurves(); this.exceedanceModel = config.hazard.exceedanceModel; this.truncationLevel = config.hazard.truncationLevel; + this.σScale = config.hazard.gmmSigmaScale; } @Override @@ -174,7 +176,6 @@ final class Transforms { Imt imt = imtEntry.getKey(); XySequence modelCurve = modelCurves.get(imt); MutableXySequence gmmCurve = MutableXySequence.copyOf(modelCurve); - MutableXySequence utilCurve = MutableXySequence.emptyCopyOf(modelCurve); /* @@ -184,20 +185,16 @@ final class Transforms { for (Entry<Gmm, List<LogicTree<GroundMotion>>> gmmEntry : imtEntry.getValue().entrySet()) { gmmCurve.clear(); - int i = 0; - for (LogicTree<GroundMotion> gmTree : gmmEntry.getValue()) { - - double rate = gms.inputs.get(i++).rate; - + List<LogicTree<GroundMotion>> gmTrees = gmmEntry.getValue(); + for (int i = 0; i < gmTrees.size(); i++) { exceedanceModel.treeExceedanceCombined( - gmTree, + gmTrees.get(i), truncationLevel, + σScale, imt, utilCurve); - - utilCurve.multiply(rate); + utilCurve.multiply(gms.inputs.get(i).rate); gmmCurve.add(utilCurve); - } curveBuilder.addCurve(imt, gmmEntry.getKey(), gmmCurve); } @@ -480,11 +477,13 @@ final class Transforms { private final Map<Imt, XySequence> logModelCurves; private final ExceedanceModel exceedanceModel; private final double truncationLevel; + private final double σScale; ClusterGroundMotionsToCurves(CalcConfig config) { this.logModelCurves = config.hazard.logModelCurves(); this.exceedanceModel = config.hazard.exceedanceModel; this.truncationLevel = config.hazard.truncationLevel; + this.σScale = config.hazard.gmmSigmaScale; } @Override @@ -531,6 +530,7 @@ final class Transforms { LogicTree<MutableXySequence> magTreeCurves = exceedanceModel.treeExceedance( gmTree, truncationLevel, + σScale, imt, utilCurve); diff --git a/src/main/java/gov/usgs/earthquake/nshmp/model/Distance.java b/src/main/java/gov/usgs/earthquake/nshmp/model/Distance.java index 21065fbd..8e85bb70 100644 --- a/src/main/java/gov/usgs/earthquake/nshmp/model/Distance.java +++ b/src/main/java/gov/usgs/earthquake/nshmp/model/Distance.java @@ -67,19 +67,10 @@ public final class Distance { double horzDist, vertDist, rupDist; - // flag to project to seisDepth if only one row and depth is below - // seisDepth - // boolean projectToDepth = false; - // if (surface.getNumRows() == 1 && surface.getLocation(0,0).depth() < - // SEIS_DEPTH) - // projectToDepth = true; - // get locations to iterate over depending on dip Iterator<Location> it; if (surface.dip() > 89) { it = surface.getColumnIterator(0); - // if (surface.getLocation(0,0).depth() < SEIS_DEPTH) - // projectToDepth = true; } else { it = surface.iterator(); } diff --git a/src/main/resources/calc/calc-config-defaults.json b/src/main/resources/calc/calc-config-defaults.json index 2de80737..d23efcf3 100644 --- a/src/main/resources/calc/calc-config-defaults.json +++ b/src/main/resources/calc/calc-config-defaults.json @@ -13,7 +13,7 @@ "sourceTypes": [], "vs30s": [], "gmmDampingRatio": 0.05, - "gmmSigmaScaling": 1.0, + "gmmSigmaScale": 1.0, "valueFormat": "ANNUAL_RATE", "customImls": {} }, diff --git a/src/test/java/gov/usgs/earthquake/nshmp/calc/CalcConfigTests.java b/src/test/java/gov/usgs/earthquake/nshmp/calc/CalcConfigTests.java index 91bafd90..eb47edc7 100644 --- a/src/test/java/gov/usgs/earthquake/nshmp/calc/CalcConfigTests.java +++ b/src/test/java/gov/usgs/earthquake/nshmp/calc/CalcConfigTests.java @@ -249,7 +249,7 @@ class CalcConfigTests { assertEquals(EnumSet.of(FAULT, ZONE, SLAB), def.sourceTypes); assertEquals(Set.of(260.0, 760.0), def.vs30s); assertEquals(0.03, def.gmmDampingRatio); - assertEquals(0.85, def.gmmSigmaScaling); + assertEquals(0.85, def.gmmSigmaScale); assertEquals(ValueFormat.POISSON_PROBABILITY, def.valueFormat); assertArrayEquals( @@ -264,7 +264,7 @@ class CalcConfigTests { assertEquals(EnumSet.noneOf(SourceType.class), def.tectonicSettings); assertEquals(Set.of(), def.vs30s); assertEquals(0.05, def.gmmDampingRatio); - assertEquals(1.0, def.gmmSigmaScaling); + assertEquals(1.0, def.gmmSigmaScale); assertEquals(ValueFormat.ANNUAL_RATE, def.valueFormat); } diff --git a/src/test/resources/calc/calc-config-extends.json b/src/test/resources/calc/calc-config-extends.json index 63a1758e..0c6c9071 100644 --- a/src/test/resources/calc/calc-config-extends.json +++ b/src/test/resources/calc/calc-config-extends.json @@ -9,7 +9,7 @@ "sourceTypes": [ "FAULT", "ZONE", "SLAB" ], "vs30s": [ 260, 760 ], "gmmDampingRatio": 0.03, - "gmmSigmaScaling": 0.85, + "gmmSigmaScale": 0.85, "valueFormat": "POISSON_PROBABILITY", "customImls": { "PGA": [0.0025, 0.0075, 0.0169, 0.0380, 0.0854, 0.192, 0.432, 0.973, 2.19, 4.92] -- GitLab