From 0fddc13b3a282c808b83364f1abca488980f23df Mon Sep 17 00:00:00 2001
From: Jan Thorbecke <janth@xs4all.nl>
Date: Fri, 16 Feb 2018 07:46:04 +0100
Subject: [PATCH] added computation of x-t shots based on raytimes and
 ampltiudes

---
 FFTlib/lib_fft.c        |  8 ++++
 corrvir/Makefile        |  3 +-
 corrvir/verbosepkg.c    |  1 +
 raytime/demo/saga.scr   | 33 +++++++++++---
 raytime/getParameters.c |  1 +
 raytime/raytime.c       | 96 +++++++++++++++++++++++++++++++++++------
 raytime/raytime.h       | 10 +++++
 7 files changed, 132 insertions(+), 20 deletions(-)
 create mode 120000 corrvir/verbosepkg.c

diff --git a/FFTlib/lib_fft.c b/FFTlib/lib_fft.c
index b186786..1bce361 100644
--- a/FFTlib/lib_fft.c
+++ b/FFTlib/lib_fft.c
@@ -416,6 +416,14 @@ void crdft(complex *cdata, REAL *rdata, int n, int sign)
 	static double *csval[MAX_NUMTHREADS];
     static int nprev[MAX_NUMTHREADS];
 
+#ifdef _OPENMP
+    //max_threads = omp_get_max_threads();
+    id = omp_get_thread_num();
+#else 
+    //max_threads = 1;
+    id = 0;
+#endif  
+`
 	if (nprev[id] != n) {
 		scl = (2.0*M_PI)/((double)n);
 		if (csval[id]) free(csval[id]);
diff --git a/corrvir/Makefile b/corrvir/Makefile
index d39cd50..679a6d9 100644
--- a/corrvir/Makefile
+++ b/corrvir/Makefile
@@ -3,7 +3,7 @@
 include ../Make_include
 
 ALLINC  = -I.
-LIBS    += -L$L -lgenfft -lm 
+LIBS    += -L$L -lgenfft
 #OPTC += -g
 
 all: corrvir
@@ -14,6 +14,7 @@ SRCC	= $(PRG).c \
 		getFileInfo.c \
 		correlate.c \
 		atopkge.c \
+		verbosepkg.c \
 		docpkge.c \
 		wallclock_time.c  \
 		getpars.c
diff --git a/corrvir/verbosepkg.c b/corrvir/verbosepkg.c
new file mode 120000
index 0000000..248253e
--- /dev/null
+++ b/corrvir/verbosepkg.c
@@ -0,0 +1 @@
+../utils/verbosepkg.c
\ No newline at end of file
diff --git a/raytime/demo/saga.scr b/raytime/demo/saga.scr
index 074e838..404fe04 100755
--- a/raytime/demo/saga.scr
+++ b/raytime/demo/saga.scr
@@ -1,12 +1,33 @@
 #!/bin/bash
 
-#../raytime     nshots=851 verbose=1 useT2=1 geomspread=1 file_rcv=Jray0.su \
-#zsrc=1200.000 xrcv1=0 xrcv2=20000 dxrcv=25 file_cp=saga_cp.su zrcv1=0 zrcv2=0  \
-#xsrc=7000 nxshot=641 nzshot=1 dxshot=9.375 \
-#dzshot=9.375 nraystep=25 method=jesper
+../raytime     nshots=851 verbose=1 useT2=1 geomspread=1 file_rcv=Jray0.su \
+zsrc=4500.000 xrcv1=0 xrcv2=20000 dxrcv=25 file_cp=saga_cp.su zrcv1=0 zrcv2=0  \
+xsrc=10000 nxshot=1 nzshot=1 dxshot=9.375 \
+dzshot=9.375 nraystep=25 method=jesper
 
 ../raytime     nshots=851 verbose=1 useT2=1 geomspread=1 file_rcv=pray0.su \
-zsrc=1200.000 xrcv1=0 xrcv2=20000 dxrcv=25 file_cp=saga_cp.su zrcv1=0 zrcv2=0  \
-xsrc=7000 nxshot=641 nzshot=1 dxshot=9.375 \
+zsrc=4500.000 xrcv1=0 xrcv2=20000 dxrcv=25 file_cp=saga_cp.su zrcv1=0 zrcv2=0  \
+xsrc=10000 nxshot=1 nzshot=1 dxshot=9.375 \
 dzshot=9.375 nraystep=25 method=fd
 
+makewave file_out=wavelet.su dt=0.0003 nt=1024 fp=20 w=g2 verbose=1 t0=0.1
+
+dt=0.004
+nt=2001
+makewave w=fp fp=15  dt=$dt file_out=wave.su nt=$nt t0=0.1 scale=0 scfft=1
+
+../raytime nshots=1 verbose=1 file_rcvtime=Gd.su  zsrc=1200.000 xrcv1=0 xrcv2=20000 dxrcv=25 dtrcv=$dt nt=$nt file_cp=saga_cp.su file_src=wave.su rec_delay=0.1 zrcv1=0 zrcv2=0 xsrc=9000 rec_delay=0.1
+
+export OMP_NUM_THREADS=2
+
+fdelmodc ischeme=1 verbose=1 file_rcv=FD.su file_den=saga_cp.su file_src=wavelet.su tmod=5.0 \
+zsrc=4500.000 xrcv1=0 xrcv2=20000 dxrcv=25 dtrcv=0.003 file_cp=saga_cp.su zrcv1=0 zrcv2=0  rec_delay=0.1 \
+xsrc=10000 top=2 right=2 left=2 bottom=2 npml=100
+
+
+for file in Jray0_time.su pray0_time.su FD_rp.su 
+do 
+file_base=${file%.su}
+sustrip < $file > $file_base.bin
+done
+
diff --git a/raytime/getParameters.c b/raytime/getParameters.c
index 4970036..89d1d34 100644
--- a/raytime/getParameters.c
+++ b/raytime/getParameters.c
@@ -266,6 +266,7 @@ int getParameters(modPar *mod, recPar *rec, srcPar *src, shotPar *shot, rayPar *
 	if (!getparint("max_nrec",&rec->max_nrec)) rec->max_nrec=15000;
 	if (!getparfloat("dxspread",&dxspread)) dxspread=0;
 	if (!getparfloat("dzspread",&dzspread)) dzspread=0;
+    if (!getparint("nt",&rec->nt)) rec->nt=1024;
 
 	/* calculates the receiver coordinates */
 	
diff --git a/raytime/raytime.c b/raytime/raytime.c
index 3e8fc7b..138461a 100644
--- a/raytime/raytime.c
+++ b/raytime/raytime.c
@@ -3,6 +3,7 @@
 #include<math.h>
 #include<assert.h>
 #include<string.h>
+#include <genfft.h>
 #include"par.h"
 #include"raytime.h"
 #include "segy.h"
@@ -40,8 +41,10 @@ char *sdoc[] = {
 "   file_cp= .......... P (cp) velocity file",
 "   file_src= ......... file with source signature",
 "   file_rcv=recv.su .. base name for receiver files",
+"   file_rcvtime= ..... receiver file in x-t",
 "   dx= ............... read from model file: if dx==0 then dx= can be used to set it",
 "   dz= ............... read from model file: if dz==0 then dz= can be used to set it",
+"   nt=1024 ........... number of time-samples in file_rcvtime",
 "" ,
 " RAY TRACING PARAMETERS:",
 "   method=jesper ..... calculation method (jesper, fd) ",
@@ -64,8 +67,6 @@ char *sdoc[] = {
 "   dzshot=0 .......... if nshot > 1: z-shift in shot locations",
 "   xsrca= ............ defines source array x-positions",
 "   zsrca= ............ defines source array z-positions",
-"   wav_random=1 ...... 1 generates (band limited by fmax) noise signatures ",
-"   src_at_rcv=1 ...... inject wavefield at receiver coordinates (1), inject at source (0)",
 "" ,
 " PLANE WAVE SOURCE DEFINITION:",
 "   plane_wave=0 ...... model plane wave with nsrc= sources",
@@ -117,26 +118,61 @@ int main(int argc, char **argv)
 	double t0, t1, t2, tinit, tray, tio;
 	size_t size;
 	int nw, n1, ix, iz, ir, ixshot, izshot;
+	int nt, ntfft, nfreq, ig;
 	int irec, sbox, ipos, nrx, nrz, nr;
     fcoord coordsx, coordgx, Time;
     icoord grid, isrc; 
-    float Jr, *ampl, *time, *ttime, *ttime_p, cp_average;
-	float dxrcv, dzrcv;
+    float Jr, *ampl, *time, *ttime, *ttime_p, cp_average, *wavelet, dw, dt;
+	float dxrcv, dzrcv, rdelay, tr;
     segy hdr;
-    char filetime[1024], fileamp[1024], *method;
-    size_t  nwrite;
+    char filetime[1024], fileamp[1024], *method, *file_rcvtime, *file_src;
+    size_t  nwrite, nread;
 	int verbose;
-    FILE *fpt, *fpa;
+    complex *cmute, *cwav;
+    FILE *fpt, *fpa, *fpwav, *fprcv;
 
 	t0= wallclock_time();
 	initargs(argc,argv);
 	requestdoc(0);
 
-	if (!getparint("verbose",&verbose)) verbose=0;
+	if(!getparint("verbose",&verbose)) verbose=0;
     if(!getparint("sbox", &sbox)) sbox = 1;
     if(!getparstring("method", &method)) method="jesper";
+	if (!getparfloat("rec_delay",&rdelay)) rdelay=0.0;
+
 	getParameters(&mod, &rec, &src, &shot, &ray, verbose);
 
+    /* read file_src if file_rcvtime is defined */
+
+    if (!getparstring("file_rcvtime",&file_rcvtime)) file_rcvtime=NULL;
+
+	if (file_rcvtime != NULL) {
+    	if (!getparstring("file_src",&file_src)) file_src=NULL;
+		if (!getparfloat("dt",&dt)) dt=0.004;
+		if (file_src != NULL ) {
+        	fpwav = fopen( file_src, "r" );
+        	assert( fpwav != NULL);
+        	nread = fread( &hdr, 1, TRCBYTES, fpwav );
+        	assert(nread == TRCBYTES);
+			ntfft = optncr(MAX(hdr.ns, rec.nt));
+ 			wavelet = (float *)calloc(ntfft,sizeof(float));
+			/* read first trace */
+        	nread = fread(wavelet, sizeof(float), hdr.ns, fpwav);
+        	assert (nread == hdr.ns);
+        	fclose(fpwav);
+		}
+		else {
+			ntfft = optncr(rec.nt);
+ 			wavelet = (float *)calloc(ntfft,sizeof(float));
+			wavelet[0] = 1.0;
+		}
+    	nfreq = ntfft/2+1;
+    	cwav    = (complex *)calloc(nfreq,sizeof(complex));
+    	cmute   = (complex *)calloc(nfreq,sizeof(complex));
+        rc1fft(wavelet,cwav,ntfft,-1);
+    	dw      = 2*M_PI/(ntfft*dt);
+	}
+
 	/* allocate arrays for model parameters: the different schemes use different arrays */
 
 	n1 = mod.nz;
@@ -177,6 +213,7 @@ int main(int argc, char **argv)
 //		rec.zr[ir]=rec.z[ir]*mod.dz;
 		if (verbose>3) vmess("receiver position %d at grid[ix=%d, iz=%d] = (x=%f z=%f)", ir, ix, rec.z[ir], rec.xr[ir]+mod.x0, rec.zr[ir]+mod.z0);
 	}
+		vmess("   - method for ray-tracing       = %s", method);
 /*
 */
 
@@ -215,14 +252,15 @@ int main(int argc, char **argv)
         fpa = fopen(fileamp, "w");
         assert(fpa != NULL);
 	}
+	if (file_rcvtime != NULL) {
+        fprcv = fopen(file_rcvtime, "w");
+        assert(fprcv != NULL);
+	}
 
     memset(&hdr,0,sizeof(hdr));
-    hdr.dt     = (unsigned short)1;
     hdr.scalco = -1000;
     hdr.scalel = -1000;
     hdr.trid   = 1;
-    hdr.trwf   = shot.n;
-    hdr.ns     = rec.n;
 
 	t1=wallclock_time();
 	tinit = t1-t0;
@@ -260,7 +298,7 @@ private (coordgx,irec,Time,Jr)
 		
             		getWaveParameter(slowness, grid, mod.dx, coordsx, coordgx, ray, &Time, &Jr);
 	
-            		time[((izshot*shot.nx)+ixshot)*rec.n + irec] = Time.x + Time.y + Time.z;
+            		time[((izshot*shot.nx)+ixshot)*rec.n + irec] = Time.x + Time.y + 0.5*Time.z;
             		ampl[((izshot*shot.nx)+ixshot)*rec.n + irec] = Jr;
             		if (verbose>4) vmess("JS: shot=%f,%f receiver at %f,%f T0=%f T1=%f T2=%f Jr=%f",coordsx.x, coordsx.z, coordgx.x, coordgx.z, Time.x, Time.y, Time.z, Jr); 
         		}
@@ -309,6 +347,9 @@ private (coordgx,irec,Time,Jr)
         	hdr.tracl  = ((izshot*shot.nx)+ixshot)+1;
         	hdr.tracf  = ((izshot*shot.nx)+ixshot)+1;
         	hdr.ntr    = shot.n;
+    		hdr.dt     = (unsigned short)1;
+    		hdr.trwf   = shot.n;
+    		hdr.ns     = rec.n;
         	//hdr.d1     = (rec.x[1]-rec.x[0])*mod.dx; // discrete
         	hdr.d1     = (rec.xr[1]-rec.xr[0]);
         	hdr.f1     = mod.x0+rec.x[0]*mod.dx;
@@ -327,11 +368,40 @@ private (coordgx,irec,Time,Jr)
             	assert(nwrite == rec.n);
 	        	fflush(fpa);
         	}
+			if (file_rcvtime != NULL) {
+    			hdr.ns     = rec.nt;
+    			hdr.trwf   = rec.n;
+    			hdr.ntr    = ((izshot*shot.nx)+ixshot+1)*rec.n;
+    			hdr.dt     = dt*1000000;
+    			hdr.d1     = dt;
+        		hdr.f1     = 0.0;
+        		hdr.d2     = (rec.xr[1]-rec.xr[0]);
+    			hdr.f2     = mod.x0+rec.x[0]*mod.dx;
+
+        		for (irec=0; irec<rec.n; irec++) {
+					ipos = ((izshot*shot.nx)+ixshot)*rec.n + irec;
+        			hdr.tracf  = irec+1;
+        			hdr.tracl  = ((izshot*shot.nx)+ixshot*shot.nz)+irec+1;
+        			hdr.gx     = 1000*(mod.x0+rec.xr[irec]);
+        			hdr.offset = (rec.xr[irec]-shot.x[ixshot]*mod.dx);
+        			hdr.gelev  = (int)(-1000*(mod.z0+rec.zr[irec]));
+
+					tr = time[ipos]+rdelay;
+                    for (ig=0; ig<nfreq; ig++) {
+                        cmute[ig].r = (cwav[ig].r*cos(ig*dw*tr-M_PI/4.0)-cwav[ig].i*sin(ig*dw*tr-M_PI/4.0))/(ntfft*ampl[ipos]);
+                        cmute[ig].i = (cwav[ig].i*cos(ig*dw*tr-M_PI/4.0)+cwav[ig].r*sin(ig*dw*tr-M_PI/4.0))/(ntfft*ampl[ipos]);
+                    }
+                	cr1fft(cmute,wavelet,ntfft,-1);
+        			nwrite = fwrite( &hdr, 1, TRCBYTES, fprcv);
+        			nwrite = fwrite( wavelet, sizeof(float), rec.nt, fprcv );
+				}
+			}
 	        t1=wallclock_time();
             tio += t1-t2;
-    	}
+    	} /* end of ixshot loop */
 	} /* end of loop over number of shots */
 	fclose(fpt);
+	if (file_rcvtime != NULL) fclose(fprcv);
 	if (ray.geomspread) fclose(fpa);
 
 	t1= wallclock_time();
diff --git a/raytime/raytime.h b/raytime/raytime.h
index fc38be6..882c78b 100644
--- a/raytime/raytime.h
+++ b/raytime/raytime.h
@@ -4,6 +4,16 @@
 #include<float.h>
 #include<math.h>
 
+#ifndef COMPLEX
+typedef struct _complexStruct { /* complex number */
+    float r,i;
+} complex;
+typedef struct _dcomplexStruct { /* complex number */
+    double r,i;
+} dcomplex;
+#endif/* complex */
+
+
 typedef struct _icoord { /* 3D coordinate integer */
     int z;
     int x;
-- 
GitLab