Skip to content

Commit cfda5b6

Browse files
Merge pull request #428 from pmpowers-usgs/sub-basin-term-update
Sub basin term update
2 parents 82d4fee + 26794f3 commit cfda5b6

6 files changed

Lines changed: 360 additions & 422 deletions

File tree

src/gov/usgs/earthquake/nshmp/gmm/AtkinsonMacias_2009.java

Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ private static final class Coefficients {
114114
private final Coefficients coeffs;
115115
private final Coefficients coeffsPGA;
116116
private final BooreAtkinson_2008 siteAmp;
117-
private final CampbellBozorgnia_2014.BasinAmp cb14basinAmp;
117+
private final CampbellBozorgnia_2014 cb14;
118118

119119
// interpolatedGmm = null if !interpolated
120120
private final boolean interpolated;
@@ -128,7 +128,7 @@ private static final class Coefficients {
128128
coeffs = new Coefficients(imt, COEFFS);
129129
coeffsPGA = new Coefficients(PGA, COEFFS);
130130
siteAmp = new BooreAtkinson_2008(imt);
131-
cb14basinAmp = new CampbellBozorgnia_2014.BasinAmp(imt);
131+
cb14 = new CampbellBozorgnia_2014(imt);
132132
interpolated = INTERPOLATED_IMTS.containsKey(imt);
133133
interpolatedGmm = interpolated
134134
? new InterpolatedGmm(subtype, imt, INTERPOLATED_IMTS.get(imt))
@@ -147,21 +147,20 @@ public final ScalarGroundMotion calc(final GmmInput in) {
147147
double site = siteAmp.siteAmp(μPga, in.vs30);
148148
double μAm = μRef + site;
149149

150-
if (!Double.isNaN(in.z2p5) && basinEffect()) {
151-
152-
double cbSite = cb14basinAmp.basinDelta(in, VS30_REF);
153-
double μCb = μRef + cbSite;
154-
155-
/* Short-circuit lower values and short periods. */
156-
int imtId = coeffs.imt.ordinal();
157-
if ((μCb < μAm) || (imtId < Imt.SA0P75.ordinal())) {
158-
return DefaultScalarGroundMotion.create(μAm, σ);
159-
} else if (imtId < Imt.SA1P0.ordinal()) {
160-
double μScaled = GmmUtils.scaleSubductionSiteAmp(coeffs.imt, μAm, μCb);
161-
return DefaultScalarGroundMotion.create(μScaled, σ);
150+
/*
151+
* Add CB14 deep basin amplification term if (1) z2p5 is non-NaN, (2) this
152+
* instance is basin amplifying and (3) T>0.5s
153+
*/
154+
if (!Double.isNaN(in.z2p5) &&
155+
basinEffect() &&
156+
coeffs.imt.ordinal() > Imt.SA0P5.ordinal()) {
157+
double cbBasinTerm = cb14.deepBasinAmplification(in.z2p5);
158+
if (coeffs.imt == Imt.SA0P75) {
159+
cbBasinTerm *= 0.585; // log T scaling at 0.75s
162160
}
163-
return DefaultScalarGroundMotion.create(μCb, σ);
161+
μAm += cbBasinTerm;
164162
}
163+
165164
return DefaultScalarGroundMotion.create(μAm, σ);
166165
}
167166

src/gov/usgs/earthquake/nshmp/gmm/BcHydro_2012.java

Lines changed: 14 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,6 @@ public abstract class BcHydro_2012 implements GroundMotionModel {
109109
private static final double SIGMA = 0.74;
110110
private static final double ΔC1_SLAB = -0.3;
111111
private static final double VS30_ROCK = 1000.0;
112-
private static final double VS30_REF = 760.0; // refrence vs30 for CB basin Δ
113112

114113
private static final Map<Imt, Range<Imt>> INTERPOLATED_IMTS = Maps.immutableEnumMap(
115114
ImmutableMap.of(SA0P03, Range.closed(SA0P02, SA0P05)));
@@ -141,7 +140,7 @@ private static final class Coefficients {
141140

142141
private final Coefficients coeffs;
143142
private final Coefficients coeffsPGA;
144-
private final CampbellBozorgnia_2014.BasinAmp cb14basinAmp;
143+
private final CampbellBozorgnia_2014 cb14;
145144

146145
// interpolatedGmm = null if !interpolated
147146
private final boolean interpolated;
@@ -150,7 +149,7 @@ private static final class Coefficients {
150149
BcHydro_2012(final Imt imt, Gmm subtype) {
151150
coeffs = new Coefficients(imt, COEFFS);
152151
coeffsPGA = new Coefficients(PGA, COEFFS);
153-
cb14basinAmp = new CampbellBozorgnia_2014.BasinAmp(imt);
152+
cb14 = new CampbellBozorgnia_2014(imt);
154153
interpolated = INTERPOLATED_IMTS.containsKey(imt);
155154
interpolatedGmm = interpolated
156155
? new InterpolatedGmm(subtype, imt, INTERPOLATED_IMTS.get(imt))
@@ -166,22 +165,20 @@ public final ScalarGroundMotion calc(final GmmInput in) {
166165
double pgaRock = exp(calcMean(coeffsPGA, isSlab(), 0.0, in.Mw, in.rRup, in.zTop, VS30_ROCK));
167166
double μAsk = calcMean(coeffs, isSlab(), pgaRock, in.Mw, in.rRup, in.zTop, in.vs30);
168167

169-
if (!Double.isNaN(in.z2p5) && basinEffect()) {
170-
171-
double μRef = calcMean(coeffs, isSlab(), pgaRock, in.Mw, in.rRup, in.zTop, VS30_REF);
172-
double cbBasin = cb14basinAmp.basinDelta(in, VS30_REF);
173-
double μCb = μRef + cbBasin;
174-
175-
/* Short-circuit lower values and short periods. */
176-
int imtId = coeffs.imt.ordinal();
177-
if ((μCb < μAsk) || (imtId < Imt.SA0P75.ordinal())) {
178-
return DefaultScalarGroundMotion.create(μAsk, SIGMA);
179-
} else if (imtId < Imt.SA1P0.ordinal()) {
180-
double μScaled = GmmUtils.scaleSubductionSiteAmp(coeffs.imt, μAsk, μCb);
181-
return DefaultScalarGroundMotion.create(μScaled, SIGMA);
168+
/*
169+
* Add CB14 deep basin amplification term if (1) z2p5 is non-NaN, (2) this
170+
* instance is basin amplifying and (3) T>0.5s
171+
*/
172+
if (!Double.isNaN(in.z2p5) &&
173+
basinEffect() &&
174+
coeffs.imt.ordinal() > Imt.SA0P5.ordinal()) {
175+
double cbBasinTerm = cb14.deepBasinAmplification(in.z2p5);
176+
if (coeffs.imt == Imt.SA0P75) {
177+
cbBasinTerm *= 0.585;// log T scaling at 0.75s
182178
}
183-
return DefaultScalarGroundMotion.create(μCb, SIGMA);
179+
μAsk += cbBasinTerm;
184180
}
181+
185182
return DefaultScalarGroundMotion.create(μAsk, SIGMA);
186183
}
187184

src/gov/usgs/earthquake/nshmp/gmm/CampbellBozorgnia_2014.java

Lines changed: 4 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -179,27 +179,11 @@ private static ScalarGroundMotion calc(
179179
}
180180

181181
/*
182-
* Convenience method for Campbell site/basin delta relative to a reference
183-
* site condition, vs30ref, which may be different than Campbell's reference
184-
* rock site condition of Vs30=1100 m/s.
182+
* Return the CB14 basin amplification term for deep basins only, z2.5 > 3km
183+
* and Fsed > 0.
185184
*/
186-
double basinDelta(GmmInput in, double vs30ref) {
187-
FaultStyle style = GmmUtils.rakeToFaultStyle_NSHMP(in.rake);
188-
boolean basinAmp = basinAmpOnly();
189-
190-
/* Rock reference value with default basin term. */
191-
double pgaRock = (vs30ref < coeffs.k1)
192-
? exp(calcMean(coeffsPGA, style, 1100.0, 0.398, 0.0, in, basinAmp))
193-
: 0.0;
194-
double μRock = calcMean(coeffs, style, vs30ref, Double.NaN, pgaRock, in, basinAmp);
195-
196-
/* Now with site/basin effect. */
197-
pgaRock = (in.vs30 < coeffs.k1)
198-
? exp(calcMean(coeffsPGA, style, 1100.0, 0.398, 0.0, in, basinAmp))
199-
: 0.0;
200-
double μBasin = calcMean(coeffs, style, in.vs30, in.z2p5, pgaRock, in, basinAmp);
201-
202-
return μBasin - μRock;
185+
double deepBasinAmplification(double z2p5) {
186+
return Math.max(calcBasinTerm(coeffs, z2p5), 0.0);
203187
}
204188

205189
// Mean ground motion model -- we use supplied vs30 and z2p5 rather than

src/gov/usgs/earthquake/nshmp/gmm/GmmUtils.java

Lines changed: 0 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -309,42 +309,4 @@ static double atkinsonTableValue(final GroundMotionTable table, final Imt imt,
309309
}
310310
return μ;
311311
}
312-
313-
/* */
314-
static double scaleSubductionSiteAmp(Imt imt, double lo, double hi) {
315-
double scale = subductionBasinPeriodScale(imt);
316-
return lo + (hi - lo) * scale;
317-
}
318-
319-
/* natural log scaling for periods between 0.2s and 1.0s */
320-
static double subductionBasinPeriodScale(Imt imt) {
321-
switch (imt) {
322-
323-
// scaling from 0.5s to 1.0s
324-
case SA0P75:
325-
return 0.585;
326-
327-
// scaling from 0.4s to 1.0s
328-
// case SA0P5:
329-
// return 0.243;
330-
// case SA0P75:
331-
// return 0.686;
332-
333-
// scaling from 0.2s to 1.0s
334-
// case SA0P25:
335-
// return 0.139;
336-
// case SA0P3:
337-
// return 0.252;
338-
// case SA0P4:
339-
// return 0.431;
340-
// case SA0P5:
341-
// return 0.569;
342-
// case SA0P75:
343-
// return 0.821;
344-
345-
default:
346-
return 1.0;
347-
}
348-
}
349-
350312
}

src/gov/usgs/earthquake/nshmp/gmm/ZhaoEtAl_2006.java

Lines changed: 14 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,6 @@ public abstract class ZhaoEtAl_2006 implements GroundMotionModel {
109109
private static final double MC_I = 6.3;
110110
private static final double MAX_SLAB_DEPTH = 125.0;
111111
private static final double INTERFACE_DEPTH = 20.0;
112-
private static final double VS30_REF = 760.0;
113112

114113
private static final Map<Imt, Range<Imt>> INTERPOLATED_IMTS = Maps.immutableEnumMap(
115114
ImmutableMap.of(
@@ -184,7 +183,7 @@ private static final class Coefficients {
184183
}
185184

186185
private final Coefficients coeffs;
187-
private final CampbellBozorgnia_2014.BasinAmp cb14basinAmp;
186+
private final CampbellBozorgnia_2014 cb14;
188187

189188
/* gmms = null if !flag */
190189
private final boolean interpolated;
@@ -194,7 +193,7 @@ private static final class Coefficients {
194193

195194
ZhaoEtAl_2006(final Imt imt, Gmm subtype) {
196195
coeffs = new Coefficients(imt, COEFFS);
197-
cb14basinAmp = new CampbellBozorgnia_2014.BasinAmp(imt);
196+
cb14 = new CampbellBozorgnia_2014(imt);
198197
interpolated = INTERPOLATED_IMTS.containsKey(imt);
199198
interpolatedGmm = interpolated
200199
? new InterpolatedGmm(subtype, imt, INTERPOLATED_IMTS.get(imt))
@@ -220,23 +219,20 @@ public final ScalarGroundMotion calc(GmmInput in) {
220219
double zSiteVs30 = siteTermStep(coeffs, in.vs30);
221220
double μZhao = calcMean(coeffs, isSlab(), zSiteVs30, in);
222221

223-
if (!Double.isNaN(in.z2p5) && basinEffect()) {
224-
225-
double cbSite = cb14basinAmp.basinDelta(in, VS30_REF);
226-
double zSiteRock = siteTermStep(coeffs, VS30_REF);
227-
double μRock = calcMean(coeffs, isSlab(), zSiteRock, in);
228-
double μCb = μRock + cbSite;
229-
230-
/* Short-circuit lower values and short periods. */
231-
int imtId = coeffs.imt.ordinal();
232-
if ((μCb < μZhao) || (imtId < Imt.SA0P75.ordinal())) {
233-
return DefaultScalarGroundMotion.create(μZhao, σ);
234-
} else if (imtId < Imt.SA1P0.ordinal()) {
235-
double μScaled = GmmUtils.scaleSubductionSiteAmp(coeffs.imt, μZhao, μCb);
236-
return DefaultScalarGroundMotion.create(μScaled, σ);
222+
/*
223+
* Add CB14 deep basin amplification term if (1) z2p5 is non-NaN, (2) this
224+
* instance is basin amplifying and (3) T>0.5s
225+
*/
226+
if (!Double.isNaN(in.z2p5) &&
227+
basinEffect() &&
228+
coeffs.imt.ordinal() > Imt.SA0P5.ordinal()) {
229+
double cbBasinTerm = cb14.deepBasinAmplification(in.z2p5);
230+
if (coeffs.imt == Imt.SA0P75) {
231+
cbBasinTerm *= 0.585;// log T scaling at 0.75s
237232
}
238-
return DefaultScalarGroundMotion.create(μCb, σ);
233+
μZhao += cbBasinTerm;
239234
}
235+
240236
return DefaultScalarGroundMotion.create(μZhao, σ);
241237
}
242238

0 commit comments

Comments
 (0)