Skip to content

Commit bf89e92

Browse files
author
field
committed
Increased MFD resolution to solve moment rate discrepancy
1 parent a5daf62 commit bf89e92

File tree

1 file changed

+45
-9
lines changed

1 file changed

+45
-9
lines changed

src/main/java/scratch/ned/nshm23/CEUS_FSS_creator.java

Lines changed: 45 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414

1515

1616
import org.opensha.commons.calc.magScalingRelations.magScalingRelImpl.WC1994_MagLengthRelationship;
17+
import org.opensha.commons.eq.MagUtils;
1718
import org.opensha.commons.geo.LocationList;
1819
import org.opensha.commons.geo.json.Feature;
1920
import org.opensha.sha.earthquake.ProbEqkSource;
@@ -302,7 +303,7 @@ public static ArrayList<FaultSystemSolution> getFaultSystemSolutionList(String n
302303
HashMap<Integer, Double> rakeForSrcIdMap = new HashMap<Integer, Double>();
303304
HashMap<Integer, String> nameForSrcIdMap = new HashMap<Integer, String>();
304305
for(int id:srcIDsList) {
305-
mfdForSrcIdMap.put(id, new SummedMagFreqDist(5.05,40,0.1));
306+
mfdForSrcIdMap.put(id, getBlankMFD());
306307
}
307308
for(int s=0;s<erf.getNumSources();s++) {
308309
NshmSource src = (NshmSource)erf.getSource(s);
@@ -376,7 +377,7 @@ else if (altSrcWtmap.keySet().contains(srcID)) // keep and set rateWt
376377

377378
// test total MFD
378379
Boolean testPassed = true;
379-
SummedMagFreqDist fssTotalMFD = new SummedMagFreqDist(5.05,40,0.1);
380+
SummedMagFreqDist fssTotalMFD = getBlankMFD();
380381
for(int rup=0;rup<fss_floater.getRupSet().getNumRuptures();rup++) {
381382
double rate = fss_floater.getRateForRup(rup);
382383
double mag = fss_floater.getRupSet().getMagForRup(rup);
@@ -500,28 +501,33 @@ else if (altSrcWtmap.keySet().contains(srcID)) // keep and set rateWt
500501
if(D) { // test participation mfds for each fault section
501502

502503
// for FSS:
503-
Boolean testPassed = true;
504-
SummedMagFreqDist fssTotalMFD = new SummedMagFreqDist(5.05,40,0.1);
504+
double fssTotalMomentRate = 0;
505+
SummedMagFreqDist fssTotalMFD = getBlankMFD();
505506
HashMap<Integer, SummedMagFreqDist> sectMfdMapFSS = new HashMap<Integer, SummedMagFreqDist>();
506507
for(int rup=0;rup<bigFSS.getRupSet().getNumRuptures();rup++) {
507508
double rate = bigFSS.getRateForRup(rup);
508509
double mag = bigFSS.getRupSet().getMagForRup(rup);
510+
fssTotalMomentRate += MagUtils.magToMoment(mag)*rate;
509511
int iMag = fssTotalMFD.getClosestXIndex(mag);
510512
List<Integer> sectsForRupList = bigFSS.getRupSet().getSectionsIndicesForRup(rup);
511513
for(int i:sectsForRupList) {
512514
if(!sectMfdMapFSS.keySet().contains(i)) {
513-
sectMfdMapFSS.put(i, new SummedMagFreqDist(5.05,40,0.1));
515+
sectMfdMapFSS.put(i, getBlankMFD());
514516
}
515517
sectMfdMapFSS.get(i).add(iMag, rate);
516518
}
517519
fssTotalMFD.add(iMag, rate);
518520
}
519521

520522
// From ERF:
521-
SummedMagFreqDist erfTotalMFD = new SummedMagFreqDist(5.05,40,0.1);
523+
double fssTotalMomentRate2 = 0;
524+
double origTotalMomentRate = 0;
525+
double aveDeltaMag=0;
526+
double numMag =0;
527+
SummedMagFreqDist erfTotalMFD = getBlankMFD();
522528
HashMap<Integer, SummedMagFreqDist> sectMfdMapERF = new HashMap<Integer, SummedMagFreqDist>();
523529
for(int id:newFltIndexMap.keySet()) {
524-
sectMfdMapERF.put(id, new SummedMagFreqDist(5.05,40,0.1));
530+
sectMfdMapERF.put(id, getBlankMFD());
525531
}
526532
for(int s=0;s<erf.getNumSources();s++) {
527533
NshmSource src = (NshmSource)erf.getSource(s);
@@ -537,12 +543,25 @@ else if (altSrcWtmap.keySet().contains(srcID)) // keep and set rateWt
537543
int iMag = erfTotalMFD.getClosestXIndex(mag);
538544
double rate = src.getRupture(r).getProbability()*srcRateWtMap.get(srcID); // rate approx equal to prob
539545
erfTotalMFD.add(iMag, rate); // this requires the exact x value (no tolerance)
546+
origTotalMomentRate += MagUtils.magToMoment(mag)*rate;
547+
fssTotalMomentRate2 += MagUtils.magToMoment(erfTotalMFD.getX(iMag))*rate;
548+
aveDeltaMag += erfTotalMFD.getX(iMag)-mag;
549+
numMag += 1;
540550
for(int sectID:srcFltSectsMap.get(srcID)) {
541551
SummedMagFreqDist mfd = sectMfdMapERF.get(sectID);
542552
mfd.add(iMag, rate);
543553
}
544554
}
545555
}
556+
557+
// compare moments
558+
double tempRatio = fssTotalMomentRate/origTotalMomentRate;
559+
double testRatio = fssTotalMomentRate/fssTotalMomentRate2;
560+
aveDeltaMag /= numMag;
561+
if(D) System.out.println("FSS:\n\tfssTotalMomentRate="+(float)fssTotalMomentRate+
562+
"\n\torigTotalMomentRate="+(float)origTotalMomentRate+"\n\tratio="+tempRatio+
563+
"\n\ttestRatio="+(float)testRatio+"\n\taveDeltaMag="+(float)aveDeltaMag);
564+
546565
// compare
547566
for(int i=0;i<fssTotalMFD.size();i++) {
548567
double val1 = fssTotalMFD.getY(i);
@@ -611,8 +630,12 @@ private static FaultSystemSolution getFaultSystemSolution(double rateWt,
611630
}
612631

613632
// now compute full rup vs floater MFDs
614-
SummedMagFreqDist mfd_full = new SummedMagFreqDist(5.05,40,0.1);
615-
SummedMagFreqDist mfd_float = new SummedMagFreqDist(5.05,40,0.1);
633+
double origTotalMoment = 0;
634+
double fssTotalMoment = 0;
635+
double aveDeltaMag=0;
636+
double numMag =0;
637+
SummedMagFreqDist mfd_full = getBlankMFD();
638+
SummedMagFreqDist mfd_float = getBlankMFD();
616639
for(int s=0;s<erf.getNumSources();s++) {
617640
NshmSource src = (NshmSource)erf.getSource(s);
618641
if(src.getNSHM_ID() == faultSection.getSectionId()) {
@@ -621,6 +644,10 @@ private static FaultSystemSolution getFaultSystemSolution(double rateWt,
621644
int iMag = mfd_full.getClosestXIndex(mag);
622645
double rate = src.getRupture(r).getProbability(); // rate approx equal to prob
623646
double rupArea = src.getRupture(r).getRuptureSurface().getArea();
647+
origTotalMoment += MagUtils.magToMoment(mag)*rate;
648+
fssTotalMoment += MagUtils.magToMoment(mfd_full.getX(iMag))*rate;
649+
aveDeltaMag += mfd_full.getX(iMag)-mag;
650+
numMag+=1;
624651
if(rupArea > 0.99*fullRupArea) {
625652
mfd_full.add(iMag, rate*rateWt);
626653
}
@@ -631,6 +658,11 @@ private static FaultSystemSolution getFaultSystemSolution(double rateWt,
631658

632659
}
633660
}
661+
aveDeltaMag /= numMag;
662+
double tempRatio = fssTotalMoment/origTotalMoment;
663+
if(D) System.out.println("FSS:\n\tfssTotalMoment="+(float)fssTotalMoment+
664+
"\n\torigTotalMoment="+(float)origTotalMoment+"\n\tratio="+tempRatio+
665+
"\n|taveDeltaMag="+(float)aveDeltaMag);
634666

635667
List<List<Integer>> sectionForRups = new ArrayList<>();
636668
ArrayList<Double> magForRupList =new ArrayList<Double>();
@@ -976,6 +1008,10 @@ private static void getSrcIDsAndFaultSectionsLists(HashMap<Integer,int[]> srcFlt
9761008
parseClusterSetFile(nshmModelDirPath+"stable-crust/fault/MO/New Madrid/usgs/west/cluster-in/all/cluster-set.json", srcFltSectsMap);
9771009
parseClusterSetFile(nshmModelDirPath+"stable-crust/fault/MO/New Madrid/usgs/west/cluster-in/center-south/cluster-set.json", srcFltSectsMap);
9781010
}
1011+
1012+
private static SummedMagFreqDist getBlankMFD() {
1013+
return new SummedMagFreqDist(5.05,80,0.05);
1014+
}
9791015

9801016

9811017
public static void main(String[] args) {

0 commit comments

Comments
 (0)