Skip to content

Commit 8bd6e28

Browse files
committed
Added srf_downsampler and associated changes to Python and GP codes to support the SRF downsampler
1 parent 8fc2057 commit 8bd6e28

File tree

11 files changed

+1989
-101
lines changed

11 files changed

+1989
-101
lines changed

bbp/comps/genslip.py

Lines changed: 57 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
#!/usr/bin/env python
1+
#!/usr/bin/env python3
22
"""
33
BSD 3-Clause License
44
5-
Copyright (c) 2021, University of Southern California
5+
Copyright (c) 2025, University of Southern California
66
All rights reserved.
77
88
Redistribution and use in source and binary forms, with or without
@@ -57,7 +57,7 @@ class Genslip(object):
5757

5858
def __init__(self, i_r_velmodel, i_r_srcfile,
5959
o_r_srffile, i_vmodel_name, sim_id=0,
60-
**kwargs):
60+
output_mrf=False, **kwargs):
6161
"""
6262
Initialize class variables
6363
"""
@@ -75,6 +75,9 @@ def __init__(self, i_r_velmodel, i_r_srcfile,
7575
self.slip_sigma = None
7676
self.range_fwidth_frac = None
7777
self.r_srcfiles = []
78+
self.output_mrf = output_mrf
79+
self.ncoarsestk = None
80+
self.ncoarsedip = None
7881

7982
# Get all src files that were passed to us
8083
if kwargs is not None and len(kwargs) > 0:
@@ -260,7 +263,7 @@ def run(self):
260263
a_fault_seg_in = os.path.join(a_tmpdir, "fault_seg.in")
261264
a_gsftmp = os.path.join(a_tmpdir, r_gsftmp)
262265

263-
r_outroot = "m%.2f-%.2fx%.2f_s%d-v5.4.1" % (cfg.CFGDICT[0]["magnitude"],
266+
r_outroot = "m%.2f-%.2fx%.2f_s%d-v5.5.2" % (cfg.CFGDICT[0]["magnitude"],
264267
cfg.CFGDICT[0]["dlen"],
265268
cfg.CFGDICT[0]["dwid"],
266269
cfg.CFGDICT[0]["seed"])
@@ -333,6 +336,37 @@ def run(self):
333336
"> %s 2>> %s" % (a_srffile, self.log))
334337
bband_utils.runprog(progstring)
335338

339+
# Start with default values
340+
self.ncoarsestk = int(cfg.NCOARSESTK)
341+
self.ncoarsedip = int(cfg.NCOARSEDIP)
342+
343+
# Check if user wants to use the srf_downsample feature
344+
if 'ncoarsestk' in cfg.CFGDICT[0]:
345+
self.ncoarsestk = int(cfg.CFGDICT[0]["ncoarsestk"])
346+
if 'ncoarsedip' in cfg.CFGDICT[0]:
347+
self.ncoarsedip = int(cfg.CFGDICT[0]["ncoarsedip"])
348+
349+
if self.ncoarsestk != 1 or self.ncoarsedip != 1:
350+
# Run downsampler if ncoarsestk/ncoarsedip != 1
351+
print("Downsampling the SRF file...")
352+
print("ncoarsestk = %d, ncoarsedip = %d" %
353+
(self.ncoarsestk, self.ncoarsedip))
354+
srf_downsample_bin = os.path.join(install.A_GP_BIN_DIR,
355+
"srf_downsample")
356+
b_srffile = os.path.join(a_indir, "%s_dsmp%dx%d.srf" %
357+
(r_outroot, self.ncoarsestk,
358+
self.ncoarsedip))
359+
progstring = ("%s ncoarsestk=%d ncoarsedip=%d < %s > %s 2>> %s\n" %
360+
(srf_downsample_bin, self.ncoarsestk,
361+
self.ncoarsedip, a_srffile, b_srffile,
362+
self.log))
363+
bband_utils.runprog(progstring)
364+
# From now on, switch to use our newly created b_srffile,
365+
# note that both original srf file from genslip and the
366+
# downsampled srf file from the downsampler are saved
367+
# in the indata folder
368+
a_srffile = b_srffile
369+
336370
#
337371
# mv result to outputfile
338372
#
@@ -343,6 +377,25 @@ def run(self):
343377
progstring = "cp %s %s" % (a_srffile, os.path.join(a_outdir, self.r_srffile))
344378
bband_utils.runprog(progstring)
345379

380+
# Generate MRF file if needed
381+
if self.output_mrf:
382+
src_base = os.path.basename(self.r_srcfile)
383+
r_mrf_file = "%s.mrf" % (src_base[0:src_base.rfind('.')])
384+
a_mrf_file = os.path.join(a_indir, r_mrf_file)
385+
srf2mrf_bin = os.path.join(install.A_GP_BIN_DIR, "srf2mrf")
386+
progstring = ("%s velfile=%s < %s > %s 2>> %s\n" %
387+
(srf2mrf_bin, a_velfile,
388+
a_srffile, a_mrf_file, self.log))
389+
bband_utils.runprog(progstring)
390+
391+
# Copy MRF file to outdata and tmpdata
392+
progstring = "cp %s %s" % (a_mrf_file,
393+
os.path.join(a_tmpdir, r_mrf_file))
394+
bband_utils.runprog(progstring)
395+
progstring = "cp %s %s" % (a_mrf_file,
396+
os.path.join(a_outdir, r_mrf_file))
397+
bband_utils.runprog(progstring)
398+
346399
# Plot SRF
347400
plot_srf.run(self.r_srffile, sim_id=self.sim_id)
348401

bbp/comps/genslip_cfg.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
#!/usr/bin/env python
1+
#!/usr/bin/env python3
22
"""
33
BSD 3-Clause License
44
5-
Copyright (c) 2021, University of Southern California
5+
Copyright (c) 2025, University of Southern California
66
All rights reserved.
77
88
Redistribution and use in source and binary forms, with or without
@@ -100,6 +100,13 @@ def __init__(self, a_srcfiles):
100100
self.DEEP_RISETIMEDEP_RANGE = 2.5
101101
self.DEEP_RISETIME_FAC = 2.0
102102

103+
# Default parameters for downsampling a SRF file
104+
# NCOARSESTK and NCOARSEDIP default value is 1
105+
# which disables any downsampling, can be changed
106+
# in the SRC file
107+
self.NCOARSESTK = 1
108+
self.NCOARSEDIP = 1
109+
103110
# Read src files
104111
self.CFGDICT = []
105112
self.num_srcfiles = len(a_srcfiles)

bbp/comps/hfsims.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"""
33
BSD 3-Clause License
44
5-
Copyright (c) 2023, University of Southern California
5+
Copyright (c) 2024, University of Southern California
66
All rights reserved.
77
88
Redistribution and use in source and binary forms, with or without
@@ -53,7 +53,7 @@ class Hfsims(object):
5353
Implement Robert Graves hfsim.csh as a python component
5454
"""
5555
def __init__(self, i_r_velmodel, i_r_srcfile, i_r_srffile, i_r_stations,
56-
i_vmodel_name, val_name=None, sim_id=0):
56+
i_vmodel_name, val_name=None, sim_id=0, use_mrf=False):
5757
self.sim_id = sim_id
5858
self.r_velmodel = i_r_velmodel
5959
self.r_srcfile = i_r_srcfile
@@ -80,6 +80,11 @@ def __init__(self, i_r_velmodel, i_r_srcfile, i_r_srffile, i_r_stations,
8080
self.deep_rvfac = None
8181
self.rvsig = None
8282
self.c_zero = None
83+
self.use_mrf = use_mrf
84+
85+
# Switch to MRF file if requested
86+
if self.use_mrf:
87+
self.r_srffile = "%s.mrf" % (os.path.splitext(self.r_srffile)[0])
8388

8489
def run(self):
8590
"""

bbp/comps/jbsim.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,13 +52,18 @@ class Jbsim(object):
5252
"""
5353

5454
def __init__(self, i_r_velmodel, i_r_srcfile, i_r_srffile,
55-
i_r_stations, i_vmodel_name, sim_id=0):
55+
i_r_stations, i_vmodel_name, sim_id=0, use_mrf=False):
5656
self.sim_id = sim_id
5757
self.r_velmodel = i_r_velmodel
5858
self.r_srcfile = i_r_srcfile
5959
self.r_srffile = i_r_srffile
6060
self.r_stations = i_r_stations
6161
self.vmodel_name = i_vmodel_name
62+
self.use_mrf = use_mrf
63+
64+
# Switch to MRF file if requested
65+
if self.use_mrf:
66+
self.r_srffile = "%s.mrf" % (os.path.splitext(self.r_srffile)[0])
6267

6368
def run(self):
6469
"""

bbp/src/gp/StandRupFormat/.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,5 @@ generic_slip2srf
44
srf2moment
55
srf2stoch
66
srf2xyz
7-
srf2mrf
7+
srf2mrf
8+
srf_downsample

bbp/src/gp/StandRupFormat/function.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,4 +66,8 @@ void gcproj(float *,float *,float *,float *,float *,double *,double *,double *,d
6666
void gen_matrices(double *,double *,float *,float *,float *);
6767
void dump_sliprate(char *,struct standrupformat *,int,float *,float *,float *);
6868

69-
void srf_to_mrf(struct standrupformat *,struct standrupformat *,struct velmodel *,int,int,int,char **);
69+
void srf_to_mrf1(struct standrupformat *,struct standrupformat *,struct velmodel *,int,int,int,char **);
70+
void srf_to_mrf6_dsampXXX(struct standrupformat *,struct standrupformat *,struct velmodel *,int,int,int,int,int,char **);
71+
void srf_to_mrf6_dsamp(struct standrupformat *,struct standrupformat *,struct velmodel *,int,int,int,int,int,int,int,char **);
72+
73+
void srf_dwnsamp(struct standrupformat *,struct standrupformat *,int,int,int,int,int,int,char **);

bbp/src/gp/StandRupFormat/makefile

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ FFLAGS = ${UFLAGS} -ffixed-line-length-132
3636

3737
##### make options
3838

39-
all: srf2stoch generic_slip2srf fault_seg2gsf srf2moment srf2xyz srf2mrf
39+
all: srf2stoch generic_slip2srf fault_seg2gsf srf2moment srf2xyz srf2mrf srf_downsample
4040

4141
test_header : test_header.c ${OBJS} ${GEOPROJ_OBJS}
4242
$(CC) $(CFLAGS) -o test_header test_header.c ${LDLIBS} ${GEOPROJ_OBJS}
@@ -70,7 +70,11 @@ srf2mrf : srf2mrf.c ${OBJS} ${GEOPROJ_OBJS}
7070
${CC} -o srf2mrf srf2mrf.c ${LDLIBS} ${INCPAR} ${GEOPROJ_OBJS}
7171
cp srf2mrf ../bin/
7272

73+
srf_downsample : srf_downsample.c ${OBJS} ${GEOPROJ_OBJS}
74+
${CC} -o srf_downsample srf_downsample.c ${LDLIBS} ${INCPAR} ${GEOPROJ_OBJS}
75+
cp srf_downsample ../bin/
76+
7377
${OBJS} : ${HEADS}
7478

7579
clean :
76-
rm -f *.o ${GENRAND_OBJS} ${BAILEY_OBJS} ${GEOPROJ_OBJS} *.o srf2xyz fault_seg2gsf srf2moment generic_slip2srf srf2stoch test_header srf2mrf
80+
rm -f *.o ${GENRAND_OBJS} ${BAILEY_OBJS} ${GEOPROJ_OBJS} *.o srf2xyz fault_seg2gsf srf2moment generic_slip2srf srf2stoch test_header srf2mrf srf_downsample

bbp/src/gp/StandRupFormat/srf2mrf.c

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,15 @@ struct standrupformat srf, mrf;
1111
char velfile[1024];
1212
struct velmodel vmod;
1313

14+
struct srf_apointvalues *apval_in, *apval_out;
15+
int ip, ig;
16+
size_t msize;
17+
18+
int ncoarsestk = 1;
19+
int ncoarsedip = 1;
20+
int stk_off = 0;
21+
int dip_off = 0;
22+
1423
int inbin = 0;
1524
int outbin = 0;
1625

@@ -21,18 +30,44 @@ sprintf(infile,"stdin");
2130
sprintf(outfile,"stdout");
2231
sprintf(velfile,"NOT_PROVIDED");
2332

33+
sprintf(mrf.src_format,"MOMENT");
34+
2435
setpar(ac,av);
2536
getpar("infile","s",infile);
2637
getpar("outfile","s",outfile);
2738
getpar("velfile","s",velfile);
39+
getpar("mrf_format","s",mrf.src_format); /* valid options: "MOMENT", ("MOMENT-1MECH"), "MOMENT-6MECH" */
40+
41+
getpar("ncoarsestk","d",&ncoarsestk);
42+
getpar("ncoarsedip","d",&ncoarsedip);
43+
44+
stk_off = (int)(0.5*(ncoarsestk-1.0) + 0.5);
45+
dip_off = (int)(0.5*(ncoarsedip-1.0) + 0.5);
46+
47+
getpar("stk_off","d",&stk_off);
48+
getpar("dip_off","d",&dip_off);
49+
2850
getpar("use_srf_lame","d",&use_srf_lame);
2951
getpar("print_command","d",&print_command);
3052
endpar();
3153

3254
read_Fvelmodel(velfile,&vmod);
3355
read_srf(&srf,infile,inbin);
3456

35-
srf_to_mrf(&srf,&mrf,&vmod,use_srf_lame,print_command,ac,av);
57+
fprintf(stderr,"np= %d\n",srf.srf_apnts.np);
58+
apval_in = srf.srf_apnts.apntvals;
59+
msize = srf.srf_apnts.np*sizeof(struct srf_apointvalues);
60+
for(ip=0;ip<srf.srf_apnts.np;ip++)
61+
msize = msize + (apval_in[ip].nt1 + apval_in[ip].nt2 + apval_in[ip].nt3)*sizeof(float);
62+
63+
msize = msize + (int)((6.0*msize)/(1.0*ncoarsestk*ncoarsedip));
64+
65+
fprintf(stderr,"memory esimate (Gb)= %.4f\n",1.0e-09*msize);
66+
67+
if(ncoarsestk == 1 && ncoarsedip == 1)
68+
srf_to_mrf1(&srf,&mrf,&vmod,use_srf_lame,print_command,ac,av);
69+
else
70+
srf_to_mrf6_dsamp(&srf,&mrf,&vmod,ncoarsestk,ncoarsedip,stk_off,dip_off,use_srf_lame,print_command,ac,av);
3671

3772
write_srf(&mrf,outfile,outbin);
3873
}
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
#include "include.h"
2+
#include "structure.h"
3+
#include "function.h"
4+
#include "defs.h"
5+
#include "getpar.h"
6+
7+
int main(int ac,char **av)
8+
{
9+
char infile[1024], outfile[1024];
10+
struct standrupformat srf_in, srf_out;
11+
12+
struct srf_apointvalues *apval_in;
13+
int ip;
14+
size_t msize;
15+
16+
int ncoarsestk = 1;
17+
int ncoarsedip = 1;
18+
int stk_off = 0;
19+
int dip_off = 0;
20+
21+
int inbin = 0;
22+
int outbin = 0;
23+
24+
int print_command = 1;
25+
26+
sprintf(infile,"stdin");
27+
sprintf(outfile,"stdout");
28+
29+
sprintf(srf_out.src_format,"SLIP");
30+
31+
setpar(ac,av);
32+
getpar("infile","s",infile);
33+
getpar("outfile","s",outfile);
34+
35+
getpar("ncoarsestk","d",&ncoarsestk);
36+
getpar("ncoarsedip","d",&ncoarsedip);
37+
38+
stk_off = (int)(0.5*(ncoarsestk-1.0) + 0.5);
39+
dip_off = (int)(0.5*(ncoarsedip-1.0) + 0.5);
40+
41+
getpar("stk_off","d",&stk_off);
42+
getpar("dip_off","d",&dip_off);
43+
44+
getpar("print_command","d",&print_command);
45+
endpar();
46+
47+
read_srf(&srf_in,infile,inbin);
48+
49+
fprintf(stderr,"np= %d\n",srf_in.srf_apnts.np);
50+
51+
apval_in = srf_in.srf_apnts.apntvals;
52+
msize = srf_in.srf_apnts.np*sizeof(struct srf_apointvalues);
53+
for(ip=0;ip<srf_in.srf_apnts.np;ip++)
54+
msize = msize + (apval_in[ip].nt1 + apval_in[ip].nt2 + apval_in[ip].nt3)*sizeof(float);
55+
56+
msize = msize + (int)((1.0*msize)/(1.0*ncoarsestk*ncoarsedip));
57+
58+
fprintf(stderr,"memory esimate (Gb)= %.4f\n",1.0e-09*msize);
59+
60+
srf_dwnsamp(&srf_in,&srf_out,ncoarsestk,ncoarsedip,stk_off,dip_off,print_command,ac,av);
61+
62+
write_srf(&srf_out,outfile,outbin);
63+
}

0 commit comments

Comments
 (0)