[cig-commits] [commit] pluggable: Replacement for convolve(). Uses fft() from SAC. (7d89cb3)

cig_noreply at geodynamics.org cig_noreply at geodynamics.org
Wed Apr 9 08:55:28 PDT 2014


Repository : ssh://geoshell/specfem3d_globe

On branch  : pluggable
Link       : https://github.com/geodynamics/specfem3d_globe/compare/64e1b38f0c5ebb4056cce0b15d41c0b9f94ab6e5...099a4d330d5b173b21e51ad441f9f429e5d37842

>---------------------------------------------------------------

commit 7d89cb33e72ffbceba69ba37332b50e1b0bf4253
Author: Leif Strand <leif at geodynamics.org>
Date:   Wed May 6 03:10:21 2009 +0000

    Replacement for convolve().  Uses fft() from SAC.


>---------------------------------------------------------------

7d89cb33e72ffbceba69ba37332b50e1b0bf4253
 UTILS/seis_process/convolve_stf.c | 89 +++++++++++++++++++++++++++++++++------
 1 file changed, 75 insertions(+), 14 deletions(-)

diff --git a/UTILS/seis_process/convolve_stf.c b/UTILS/seis_process/convolve_stf.c
index 6671b9d..eecd4b6 100644
--- a/UTILS/seis_process/convolve_stf.c
+++ b/UTILS/seis_process/convolve_stf.c
@@ -27,6 +27,76 @@
 #include "sac.h"
 #include "sacio.h"
 
+
+/* defined in libsac */
+void fft(float *xreal, float *ximag, int n, int idir);
+
+
+static void fzero(float *dst, int n) {
+    while (n)
+        dst[--n] = 0.0;
+}
+
+static void fcpy(float *dst, const float *src, int n) {
+    while (n) {
+        --n;
+        dst[n] = src[n];
+    }
+}
+
+void convolve(float **pconv, int *pnconv,
+              const float *data, int ndata,
+              const float *stf,  int nstf)
+{
+    int nconv, ncorr, i;
+    struct { float *xreal, *ximag; } cdata, cstf, ccorr;
+    float *conv, *buffer;
+    
+    nconv = ndata + nstf - 1;
+    conv = (float *)malloc(nconv * sizeof(float));
+    
+    for (ncorr = 2; ncorr < nconv; ncorr *= 2)
+        ;
+    
+    buffer = (float *)malloc(2 * 3 * ncorr * sizeof(float));
+    cdata.xreal = buffer + 0 * ncorr;
+    cdata.ximag = buffer + 1 * ncorr;
+    cstf.xreal  = buffer + 2 * ncorr;
+    cstf.ximag  = buffer + 3 * ncorr;
+    ccorr.xreal = buffer + 4 * ncorr;
+    ccorr.ximag = buffer + 5 * ncorr;
+    
+    fcpy(cdata.xreal, data, ndata);
+    fzero(cdata.xreal + ndata, ncorr - ndata);
+    fzero(cdata.ximag, ncorr);
+    
+    fcpy(cstf.xreal, stf, nstf);
+    fzero(cstf.xreal + nstf, ncorr - nstf);
+    fzero(cstf.ximag, ncorr);
+    
+    fft(cdata.xreal, cdata.ximag, ncorr, 1);
+    fft(cstf.xreal, cstf.ximag, ncorr, 1);
+    
+    for (i = 0; i < ncorr; ++i) {
+        /* ccorr[i] = cdata[i] * cstf[i] */
+        ccorr.xreal[i] = cdata.xreal[i] * cstf.xreal[i] - cdata.ximag[i] * cstf.ximag[i];
+        ccorr.ximag[i] = cdata.xreal[i] * cstf.ximag[i] + cdata.ximag[i] * cstf.xreal[i];
+    }
+    
+    fft(ccorr.xreal, ccorr.ximag, ncorr, -1);
+    for (i = 0; i < nconv; ++i) {
+        conv[i] = ccorr.xreal[i] / (float)ncorr;
+    }
+    
+    free(buffer);
+    
+    *pconv = conv;
+    *pnconv = nconv;
+    
+    return;
+}
+
+
 int
 main(int argc, char *argv[])
 {
@@ -55,7 +125,7 @@ main(int argc, char *argv[])
     cstf = argv[1][0];
 
     errno = 0;
-    hdur = strtof(argv[2], &endpt);
+    hdur = (float)strtod(argv[2], &endpt);
     if(errno || endpt == argv[2] || *endpt != 0) {
         fprintf(stderr,"No floating point number can be formed from %s\n",argv[2]);
         return -1;
@@ -73,9 +143,9 @@ main(int argc, char *argv[])
     datasize = 0;
     data = NULL;
     for (j=3; j<argc; j++) {
-        long int max, npts, nlen, nerr;
+        int max, npts, nlen, nerr;
         float beg, del, dt, origin, tmp[1];
-        long int nstf, nconv, i;
+        int nstf, nconv, i;
         float hstf, *stf, *conv;
 
 
@@ -85,7 +155,7 @@ main(int argc, char *argv[])
         /* read header to get the length of time series */
         max = 1;
         rsac1(argv[j], tmp, &nlen, &beg, &del, &max, &nerr, strlen(argv[j]));
-        if(nerr) {
+        if(nerr != -803) {
             fprintf(stderr,"Error reading sac file %s\n",argv[j]);
             return -1;
         }
@@ -152,16 +222,7 @@ main(int argc, char *argv[])
 
 
         /* creat convolution time series */
-        nconv = nstf + npts - 1;
-        if((conv = (float *) malloc(nconv * sizeof(float))) == NULL) {
-            fprintf(stderr,"Error in allocating memory for convolution function\n");
-            return -1;
-        }
-        /* XXX: convolve */
-        //if(convolve(data,npts,stf,nstf,conv) != nconv) {
-        //    fprintf(stderr,"Error convolving source time function\n");
-        //    return -1;
-        //}
+        convolve(&conv,&nconv,data,npts,stf,nstf);
         for(i=0; i<nconv; i++)
             conv[i] *= dt;
 



More information about the CIG-COMMITS mailing list