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 7ec631bf64bdfeee00cdf4741225004daa35db5a..48daad717e65b25cfe428244dd220b9da169ab51 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 2921bcff9f52cb7847668267e18d405467f90679..63bf9a35ca5c900148bc3af1809bd3de1a6f5830 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 8e9988b8cbce810964198a8578fccf6a7301ea13..27aecac80e599f4326bc67e274f6ae298c0ac375 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 21065fbde3e4ceaf78f3115ea3e40f9387fe770b..8e85bb709db74afe4d0e9c09a30a68c5b532c30e 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 2de807379fd6a2b2c1b9d511d23ac232028539a3..d23efcf322afe43f6f7d847e861926c1c83107e3 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 91bafd901a32df139f352a673a5dd73cfb67eb7d..eb47edc7335898e77b1fdfaf7a0b4878c44f5aa2 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 63a1758e405c11b2bd3c2997d1815c4c60bcea57..0c6c907131bbcb38d6ca73b122534d7ba19bc7d7 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]