diff --git a/src/main/java/gov/usgs/earthquake/nshmp/gmm/ChapmanGuo_2021.java b/src/main/java/gov/usgs/earthquake/nshmp/gmm/ChapmanGuo_2021.java index 7798c15af1ac9daf7253fe534b7d2a3715d92302..105031930798d1c5eae16e758f7963ce47c223e0 100644 --- a/src/main/java/gov/usgs/earthquake/nshmp/gmm/ChapmanGuo_2021.java +++ b/src/main/java/gov/usgs/earthquake/nshmp/gmm/ChapmanGuo_2021.java @@ -34,7 +34,7 @@ class ChapmanGuo_2021 { Imt.mprsImts().toArray(new Imt[0])); static final double VS_REF = 1000.0; - static final double Z_CUT = 0.5; + static final double Z_CUT = 0.2; private static final double[] Z = { 0.0, 0.1, 0.2, 0.3, 0.4, 0.6, 0.8, @@ -81,12 +81,12 @@ class ChapmanGuo_2021 { /** * Return the depth scaling factor for application of reference site scaling. - * Curently set to 0.0 at z = 0.0 km and 1.0 at z = 0.5 km. * * @param z sediment depth (in km) */ static double zSiteScale(double z) { - return Math.min(1.0, z / Z_CUT); + double s = 1.0 - Math.exp(-z / Z_CUT); + return s * s * s * s; } /** diff --git a/src/main/java/gov/usgs/earthquake/nshmp/gmm/NgaEast.java b/src/main/java/gov/usgs/earthquake/nshmp/gmm/NgaEast.java index b10eafa919b30c9c2ba340f9bbc12a42b086d54b..4fd40b2b6fa78d4b2fc6017e68019b8625effd43 100644 --- a/src/main/java/gov/usgs/earthquake/nshmp/gmm/NgaEast.java +++ b/src/main/java/gov/usgs/earthquake/nshmp/gmm/NgaEast.java @@ -423,19 +423,19 @@ public abstract class NgaEast implements GroundMotionModel { double fCpa = cpa ? log(ChapmanGuo_2021.cpaPsaRatio(imt, in.zSed, in.Mw, in.rJB)) : 0.0; + double zScale = cpa + ? ChapmanGuo_2021.zSiteScale(in.zSed) + : 0.0; Position p = tables[0].position(in.rRup, in.Mw); double[] μs = new double[MODEL_COUNT]; for (int i = 0; i < MODEL_COUNT; i++) { double μ = tables[i].get(p); double μPga = exp(pgaTables[i].get(p)); SiteAmp.Value fSite = siteAmp.calc(μPga, in.vs30); - if (cpa) { - double zScale = ChapmanGuo_2021.zSiteScale(in.zSed); - SiteAmp.Value fCpaRef = siteAmp.calc(μPga, ChapmanGuo_2021.VS_REF); - double cpaSiteΔ = zScale * (fSite.siteAmp - fCpaRef.siteAmp); - fSite = new SiteAmp.Value(fSite.siteAmp - cpaSiteΔ, fSite.σ); - } - μs[i] = fSite.apply(μ) + fCpa; + double cpaSiteCorr = cpa + ? siteAmp.calc(μPga, ChapmanGuo_2021.VS_REF).siteAmp * zScale + : 0.0; + μs[i] = fSite.apply(μ) + fCpa - cpaSiteCorr; } double[] σs = new double[] { sigmaEpri(in.Mw), @@ -579,6 +579,9 @@ public abstract class NgaEast implements GroundMotionModel { double fCpa = cpa ? log(ChapmanGuo_2021.cpaPsaRatio(imt, in.zSed, in.Mw, in.rJB)) : 0.0; + double zScale = cpa + ? ChapmanGuo_2021.zSiteScale(in.zSed) + : 0.0; Position p = tables.values().iterator().next().position(in.rRup, in.Mw); double[] μs = new double[GMMS.size()]; for (int i = 0; i < GMMS.size(); i++) { @@ -600,14 +603,10 @@ public abstract class NgaEast implements GroundMotionModel { μPga = exp(pgaTables.get(seed).get(p)); } SiteAmp.Value fSite = siteAmp.calc(μPga, in.vs30); - - if (cpa) { - double zScale = ChapmanGuo_2021.zSiteScale(in.zSed); - SiteAmp.Value fCpaRef = siteAmp.calc(μPga, ChapmanGuo_2021.VS_REF); - double cpaSiteΔ = zScale * (fSite.siteAmp - fCpaRef.siteAmp); - fSite = new SiteAmp.Value(fSite.siteAmp - cpaSiteΔ, fSite.σ); - } - μs[i] = fSite.apply(μ) + fCpa; + double cpaSiteCorr = cpa + ? siteAmp.calc(μPga, ChapmanGuo_2021.VS_REF).siteAmp * zScale + : 0.0; + μs[i] = fSite.apply(μ) + fCpa - cpaSiteCorr; } double[] σs = new double[] { diff --git a/src/main/java/gov/usgs/earthquake/nshmp/model/SiteData.java b/src/main/java/gov/usgs/earthquake/nshmp/model/SiteData.java index 54356f7569b304769397c217fef4fe976474e06c..ebd29d447fd6d459dab46c9734bb728f4c38aaca 100644 --- a/src/main/java/gov/usgs/earthquake/nshmp/model/SiteData.java +++ b/src/main/java/gov/usgs/earthquake/nshmp/model/SiteData.java @@ -87,7 +87,8 @@ public class SiteData { } for (Margin margin : margins) { Location snapped = snapToGrid(location, margin.spacing, margin.scale); - if (margin.contains(snapped)) { + // check map because margin data is sparse within polygon + if (margin.contains(snapped) && margin.data.containsKey(snapped)) { builder.marginValues(margin.data.get(snapped)); break; }