From ae24414dfa1e89087493c7ff578779cd3f0f4cf8 Mon Sep 17 00:00:00 2001 From: Peter Powers <pmpowers@usgs.gov> Date: Mon, 30 Sep 2024 14:44:03 -0600 Subject: [PATCH] added mag curve flags --- .../earthquake/nshmp/calc/HazardCurves.java | 26 +++++---- .../earthquake/nshmp/calc/Transforms.java | 53 ++++++++++++------- 2 files changed, 49 insertions(+), 30 deletions(-) diff --git a/src/main/java/gov/usgs/earthquake/nshmp/calc/HazardCurves.java b/src/main/java/gov/usgs/earthquake/nshmp/calc/HazardCurves.java index b1f57bdf..2a7a090a 100644 --- a/src/main/java/gov/usgs/earthquake/nshmp/calc/HazardCurves.java +++ b/src/main/java/gov/usgs/earthquake/nshmp/calc/HazardCurves.java @@ -50,13 +50,17 @@ final class HazardCurves { * Specialized constructor that creates a single HazardCurves from the results * of processing a partitioned InputList. */ - static HazardCurves combine(InputList inputs, List<HazardCurves> curvesList) { + static HazardCurves combine( + InputList inputs, + List<HazardCurves> curvesList, + boolean magCurves) { + List<GroundMotions> groundMotionsList = curvesList.stream() .map(curves -> curves.groundMotions) .collect(toList()); GroundMotions groundMotions = GroundMotions.combine(inputs, groundMotionsList); return builder(groundMotions) - .addPartitioned(curvesList) + .addPartitioned(curvesList, magCurves) .build(); } @@ -112,7 +116,7 @@ final class HazardCurves { * the builder with a combined GroundMotions object previously created from * the supplied HazardCurves. */ - private Builder addPartitioned(List<HazardCurves> curvesList) { + private Builder addPartitioned(List<HazardCurves> curvesList, boolean magCurves) { /* Add GMM curves. */ Map<Imt, Map<Gmm, XySequence>> model = curvesList.get(0).curveMap; @@ -128,13 +132,15 @@ final class HazardCurves { } } - /* Add magnitude curves. */ - for (HazardCurves curves : curvesList) { - for (Imt imt : curves.magMap.keySet()) { - TreeMap<Double, MutableXySequence> dest = magCurveMap.get(imt); - curves.magMap.get(imt).entrySet().stream() - .filter(e -> e.getValue() != null) - .forEach(e -> dest.merge(e.getKey(), e.getValue(), MutableXySequence::add)); + if (magCurves) { + /* Add magnitude curves. */ + for (HazardCurves curves : curvesList) { + for (Imt imt : curves.magMap.keySet()) { + TreeMap<Double, MutableXySequence> dest = magCurveMap.get(imt); + curves.magMap.get(imt).entrySet().stream() + .filter(e -> e.getValue() != null) + .forEach(e -> dest.merge(e.getKey(), e.getValue(), MutableXySequence::add)); + } } } 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 5bcebff9..b8c59a40 100644 --- a/src/main/java/gov/usgs/earthquake/nshmp/calc/Transforms.java +++ b/src/main/java/gov/usgs/earthquake/nshmp/calc/Transforms.java @@ -163,6 +163,7 @@ final class Transforms { private final double truncationLevel; private final double σScale; private final GmmTree gmms; + private final boolean magCurves; GroundMotionsToCurves(CalcConfig config, GmmTree gmms) { this.modelCurves = config.hazard.logModelCurves(); @@ -170,6 +171,7 @@ final class Transforms { this.truncationLevel = config.hazard.truncationLevel; this.σScale = config.gmm.sigmaScale; this.gmms = gmms; + this.magCurves = config.output.dataTypes.contains(DataType.MAGNITUDE); } @Override @@ -209,12 +211,14 @@ final class Transforms { utilCurve.multiply(gms.inputs.get(i).rate); gmmCurve.add(utilCurve); - // utilCurve has been added to a receiver so we can modify it here - // to be added to the magnitude curve map - curveBuilder.addMagCurve( - imt, - gms.inputs.get(i).Mw, - utilCurve.multiply(gmms.gmmWeight(gmm))); + if (magCurves) { + // utilCurve has been added to a receiver so we can modify it here + // to be added to the magnitude curve map + curveBuilder.addMagCurve( + imt, + gms.inputs.get(i).Mw, + utilCurve.multiply(gmms.gmmWeight(gmm))); + } } curveBuilder.addGmmCurve(imt, gmm, gmmCurve); } @@ -405,7 +409,10 @@ final class Transforms { List<HazardCurves> curvesList = getUnchecked(allAsList(asyncCurvesList)); // combine and consolidate - HazardCurves hazardCurves = HazardCurves.combine(master, curvesList); + HazardCurves hazardCurves = HazardCurves.combine( + master, + curvesList, + config.output.dataTypes.contains(DataType.MAGNITUDE)); CurveConsolidator consolidator = new CurveConsolidator( ruptures, gmms, config); @@ -511,6 +518,7 @@ final class Transforms { private final double truncationLevel; private final double σScale; private final GmmTree gmms; + private final boolean magCurves; ClusterGroundMotionsToCurves(CalcConfig config, GmmTree gmms) { this.logModelCurves = config.hazard.logModelCurves(); @@ -518,6 +526,7 @@ final class Transforms { this.truncationLevel = config.hazard.truncationLevel; this.σScale = config.gmm.sigmaScale; this.gmms = gmms; + this.magCurves = config.output.dataTypes.contains(DataType.MAGNITUDE); } @Override @@ -594,18 +603,20 @@ final class Transforms { faultCurves.put(gmm, faultTreeCurves); } - /* - * The weighted average magnitudes of each rupture in the cluster for - * magnitude curve collection. - */ - double wtMag = 0.0; - for (HazardInput in : groundMotions.inputs) { - wtMag += in.Mw * in.rate; // Mw weight is stored in rate + if (magCurves) { + /* + * The weighted average magnitudes of each rupture in the cluster + * for magnitude curve collection. + */ + double wtMag = 0.0; + for (HazardInput in : groundMotions.inputs) { + wtMag += in.Mw * in.rate; // Mw weight is stored in rate + } + avgMag.add(wtMag); } - avgMag.add(wtMag); } - /* Average magnitude over a cluster. */ + /* Average magnitude over a cluster. NaN if !magCurves */ double clusterMag = DoubleData.sum(avgMag) / avgMag.size(); /* Cluster exceedance */ @@ -630,10 +641,12 @@ final class Transforms { clusterCurve.multiply(rate); curveBuilder.addGmmCurve(imt, gmm, clusterCurve); - curveBuilder.addMagCurve( - imt, - clusterMag, - clusterCurve.multiply(gmms.gmmWeight(gmm))); + if (magCurves) { + curveBuilder.addMagCurve( + imt, + clusterMag, + clusterCurve.multiply(gmms.gmmWeight(gmm))); + } } } return curveBuilder.build(); -- GitLab