From aced96cd509cf79cff0e95ad2384a421608b6f80 Mon Sep 17 00:00:00 2001 From: Jan at TU-Delft <J.W.Thorbecke@tudelft.nl> Date: Thu, 28 Feb 2019 15:54:04 +0100 Subject: [PATCH] added MDD application --- MDD/Makefile | 56 +++ MDD/atopkge.c | 1 + MDD/computeMatrixInverse.c | 524 +++++++++++++++++++++++ MDD/deconvolve.c | 192 +++++++++ MDD/docpkge.c | 1 + MDD/getFileInfo.c | 1 + MDD/getpars.c | 1 + MDD/mdd.c | 593 ++++++++++++++++++++++++++ MDD/name_ext.c | 1 + MDD/par.h | 1 + MDD/readShotData.c | 142 +++++++ MDD/segy.h | 849 +++++++++++++++++++++++++++++++++++++ MDD/verbosepkg.c | 1 + MDD/wallclock_time.c | 1 + MDD/writeEigen.c | 55 +++ Makefile | 3 + utils/getFileInfo.c | 3 - utils/green3D | Bin 147424 -> 0 bytes 18 files changed, 2422 insertions(+), 3 deletions(-) create mode 100644 MDD/Makefile create mode 120000 MDD/atopkge.c create mode 100644 MDD/computeMatrixInverse.c create mode 100644 MDD/deconvolve.c create mode 120000 MDD/docpkge.c create mode 120000 MDD/getFileInfo.c create mode 120000 MDD/getpars.c create mode 100644 MDD/mdd.c create mode 120000 MDD/name_ext.c create mode 120000 MDD/par.h create mode 100644 MDD/readShotData.c create mode 100644 MDD/segy.h create mode 120000 MDD/verbosepkg.c create mode 120000 MDD/wallclock_time.c create mode 100644 MDD/writeEigen.c delete mode 100755 utils/green3D diff --git a/MDD/Makefile b/MDD/Makefile new file mode 100644 index 0000000..7cb5f2d --- /dev/null +++ b/MDD/Makefile @@ -0,0 +1,56 @@ +# Makefile + +include ../Make_include + +######################################################################## +# define general include and system library +ALLINC = -I. +LIBS += -mkl -L$L -lgenfft $(LIBSM) +CFLAGS += -I$(MKLROOT)/include + +#LIBS += -lblas -llapack -L$L -lgenfft $(LIBSM) -lc -lm + +all: mdd + +PRG = mdd + +SRCC = $(PRG).c \ + atopkge.c \ + docpkge.c \ + getpars.c \ + readShotData.c \ + writeEigen.c \ + deconvolve.c \ + computeMatrixInverse.c \ + getFileInfo.c \ + verbosepkg.c \ + name_ext.c \ + wallclock_time.c + +OBJC = $(SRCC:%.c=%.o) + +$(PRG): $(OBJC) + $(CC) $(LDFLAGS) $(CFLAGS) $(OPTC) -o $(PRG) $(OBJC) $(LIBS) + +install: $(PRG) + cp $(PRG) $B + +clean: + rm -f core $(OBJC) $(OBJM) $(PRG) + +realclean: + rm -f core $(OBJC) $(OBJM) $(PRG) $B/$(PRG) + + +print: Makefile $(SRC) + $(PRINT) $? + @touch print + +count: + @wc $(SRC) + +tar: + @tar cf $(PRG).tar Makefile $(SRC) && compress $(PRG).tar + + + diff --git a/MDD/atopkge.c b/MDD/atopkge.c new file mode 120000 index 0000000..5107e2b --- /dev/null +++ b/MDD/atopkge.c @@ -0,0 +1 @@ +../utils/atopkge.c \ No newline at end of file diff --git a/MDD/computeMatrixInverse.c b/MDD/computeMatrixInverse.c new file mode 100644 index 0000000..a4ba57f --- /dev/null +++ b/MDD/computeMatrixInverse.c @@ -0,0 +1,524 @@ +#include<math.h> +#include<stdlib.h> +#include<stdio.h> +#include <assert.h> + +#define MAX(x,y) ((x) > (y) ? (x) : (y)) + +/* Cholesky based inverse */ +void cpotrf_(char *uplo, int *N, float *A, int *lda, int *info); +void cpotri_(char *uplo, int *N, float *A, int *lda, int *info); + +/* LU based inverse */ +void cgetrf_(int *M, int *N, float *A, int *lda, int *ipvt, int *info); +void cgetri_(int *N, float *A, int *lda, int *ipvt, float *work, int *lwork, int *info); +void zgetrf_(int *M, int *N, double *A, int *lda, int *ipvt, int *info); +void zgetri_(int *N, double *A, int *lda, int *ipvt, double *work, int *lwork, int *info); +int ilaenv_(int *ispec, char *name, char *opts, int *n1, int *n2, int *n3, int *n4); + +/* SVD based inverse */ +void cgesvd_(char *jobu, char *jobvt, int *M, int *N, float *A, int *lda, float *S, float *U, int *ldu, float *vt, int *ldvt, float *work, int *lwork, float *rwork, int *info); +void zgesvd_(char *jobu, char *jobvt, int *M, int *N, double *A, int *lda, double *S, double *U, int *ldu, double *vt, int *ldvt, double *work, int *lwork, double *rwork, int *info); +void cgesdd_(char *jobz, int *M, int *N, float *A, int *lda, float *S, float *U, int *ldu, float *vt, int *ldvt, float *work, int *lwork, float *rwork, int *iwork, int *info); + +/* Eigenvalues */ +void zgeev_(char *jobvl, char *jobvr, int *N, double *A, int *lda, double *S, double *vl, int *ldvl, double *vr, int *ldvr, + double *work, int *lwork, double *rwork, int *info); + +typedef struct { /* complex number */ + float r,i; +} complex; + +void computeMatrixInverse(complex *matrix, int nxm, int rthm, float eps_a, float eps_r, float numacc, int eigenvalues, float *eigen, int iw, int verbose) +{ + int i,j,k,N,lda,info,lwork,*ipvt; + float energy; + complex tmp, one, *work; + char *uplo; + + uplo = "U"; + lda = N = nxm; + one.r = 1.0; + one.i = 0.0; + + if (rthm==0) { + energy=0.0; + if (eps_r != 0.0) { + for (i=0; i<nxm; i++) { + for (j=0; j<nxm; j++) { + tmp = matrix[i*nxm+j]; + energy += sqrt(tmp.r*tmp.r+tmp.i*tmp.i); + } +// fprintf(stderr,"i=%d energy=%e\n", i, energy); + } + } + if (verbose>1) fprintf(stderr,"energy=%e eps_r=%e eps_a=%e\n", energy, eps_r*energy, eps_a); + /* add small value at diagonal */ +#pragma ivdep + for (i=0; i<nxm; i++) { + tmp.r = eps_r*energy+eps_a; + matrix[i*nxm+i].r+=tmp.r; + } + /* Cholesky based matrix inversion */ + cpotrf_(uplo, &N, &matrix[0].r, &lda, &info); + assert (info == 0); + cpotri_(uplo, &N, &matrix[0].r, &lda, &info); + assert (info == 0); + /* fill lower part of inverse matrix */ + for (i=0; i<nxm; i++) { +#pragma ivdep + for (j=i+1; j<nxm; j++) { + matrix[i*nxm+j].r=matrix[j*nxm+i].r; + matrix[i*nxm+j].i=-1.0*matrix[j*nxm+i].i; + } + } + + } + else if (rthm==1) { + int ispec, n1, nb; + char *name , *opts; + + ispec = 1; + name = "CGETRI"; + n1 = nxm; + nb = ilaenv_(&ispec, name, opts, &n1, &n1, &n1, &n1); + nb = MAX(1,nb); + lwork = nb*nxm; + ipvt = (int *)malloc(nxm*sizeof(int)); + work = (complex *)malloc(lwork*sizeof(complex)); + + energy=0.0; + if (eps_r != 0.0) { + for (i=0; i<nxm; i++) { + for (j=0; j<nxm; j++) { + tmp = matrix[i*nxm+j]; + energy += sqrt(tmp.r*tmp.r+tmp.i*tmp.i); + } + } + } + if (verbose>1) fprintf(stderr,"eps_r=%e eps_a=%e\n", eps_r*energy, eps_a); + /* add small value at diagonal */ + for (i=0; i<nxm; i++) { + tmp.r = eps_r*energy+eps_a; + matrix[i*nxm+i].r+=tmp.r; + } + /* LU based matrix inversion */ + cgetrf_(&nxm, &nxm, &matrix[0].r, &nxm, ipvt, &info); + assert (info == 0); + cgetri_(&nxm, &matrix[0].r, &nxm, ipvt, &work[0].r, &lwork, &info); + assert (info == 0); + + free(ipvt); + free(work); + } + else if (rthm==2) { /* SVD general algorithm most accurate */ + float *rwork, *S; + double S0,Si; + complex *U, *VT, a, b; + char *jobu, *jobvt; + int neig; + + energy=0.0; + if (eps_r != 0.0) { + for (i=0; i<nxm; i++) { + for (j=0; j<nxm; j++) { + tmp = matrix[i*nxm+j]; + energy += sqrt(tmp.r*tmp.r+tmp.i*tmp.i); + } + } + fprintf(stderr,"energy = %e\n", energy); + } + if (verbose>1) fprintf(stderr,"eps_r=%e eps_a=%e\n", eps_r*energy, eps_a); + /* add small value at diagonal */ + for (i=0; i<nxm; i++) { + tmp.r = eps_r*energy+eps_a; + matrix[i*nxm+i].r+=tmp.r; + } + + jobu = "A"; + jobvt = "A"; + lda = N = nxm; + lwork = N*8; + S = (float *)malloc(N*sizeof(float)); + U = (complex *)malloc(N*N*sizeof(complex)); + VT = (complex *)malloc(N*N*sizeof(complex)); + work = (complex *)malloc(lwork*sizeof(complex)); + rwork = (float *)malloc(5*N*sizeof(float)); + + /* Compute SVD */ + cgesvd_(jobu, jobvt, &N, &N, &matrix[0].r, &lda, S, &U[0].r, &lda, &VT[0].r, + &lda, &work[0].r, &lwork, rwork, &info); + assert (info == 0); + + if (eigenvalues) { + for (i=0; i<N; i++) { + eigen[i] = S[i]; + } + } + + /* Compute inverse */ + S0 = S[0]; + neig = 0; + for (i=0; i<N; i++) { +/* fprintf(stderr,"S[%d] = %e ",i,S[i]);*/ + Si = S[i]; + if ((Si/S0) > numacc) { S[i]=1.0/S[i]; neig++; } + else S[i] = 0.0; + /*S[i]=1.0/(S[i]+eps_r*S[0]);*/ +/* fprintf(stderr,"S^-1[%d] = %e\n",i,S[i]);*/ + } + if(verbose) fprintf(stderr,"fraction of eigenvalues used = %.3f\n",(float)(neig/((float)N))); + + for (j=0; j<N; j++) { + for (i=0; i<N; i++) { + U[j*N+i].r=S[j]*U[j*N+i].r; + U[j*N+i].i=-1.0*S[j]*U[j*N+i].i; + } + } + for (j=0; j<N; j++) { + for (i=0; i<N; i++) { + tmp.r = tmp.i = 0.0; + for (k=0; k<N; k++) { + a = U[k*N+j]; + b.r = VT[i*N+k].r; + b.i = -1.0*VT[i*N+k].i; + tmp.r += (a.r*b.r-a.i*b.i); + tmp.i += (a.r*b.i+a.i*b.r); + } + matrix[j*nxm+i] = tmp; + } + } + + free(U); + free(VT); + free(S); + free(work); + free(rwork); + } + else if (rthm==3) { /* SVD algorithm Divide and Conquerer less accurate */ + /* CGESDD*/ + int *iwork; + int neig; + float *rwork, *S; + double S0,Si; + complex *U, *VT, a, b; + char *jobz; + + energy=0.0; + if (eps_r != 0.0) { + for (i=0; i<nxm; i++) { + for (j=0; j<nxm; j++) { + tmp = matrix[i*nxm+j]; + energy += sqrt(tmp.r*tmp.r+tmp.i*tmp.i); + } + } + } + if (verbose>1) fprintf(stderr,"eps_r=%e eps_a=%e\n", eps_r*energy, eps_a); + /* add small value at diagonal */ + for (i=0; i<nxm; i++) { + tmp.r = eps_r*energy+eps_a; + matrix[i*nxm+i].r+=tmp.r; + } + + jobz = "A"; + lda = N = nxm; + lwork = N*N+4*N; + S = (float *)malloc(N*sizeof(float)); + U = (complex *)malloc(N*N*sizeof(complex)); + VT = (complex *)malloc(N*N*sizeof(complex)); + work = (complex *)malloc(lwork*sizeof(complex)); + rwork = (float *)malloc(5*(N*N+N)*sizeof(float)); + iwork = (int *)malloc(8*N*sizeof(int)); + + /* Compute SVD */ + cgesdd_(jobz, &N, &N, &matrix[0].r, &lda, S, &U[0].r, &lda, &VT[0].r, + &lda, &work[0].r, &lwork, rwork, iwork, &info); + assert (info == 0); + + if (eigenvalues) { + for (i=0; i<N; i++) { + eigen[i] = S[i]; + } + } + + /* Compute inverse */ + S0 = S[0]; + neig = 0; + for (i=0; i<N; i++) { +/* fprintf(stderr,"S[%d] = %e S0 = %e\n ",i,S[i], S0);*/ + Si = S[i]; + if ((Si/S0) > numacc) { S[i]=1.0/S[i]; neig++; } + else S[i] = 0.0; +/* fprintf(stderr,"S^-1[%d] = %e\n",i,S[i]);*/ + } + if(verbose) fprintf(stderr,"fraction of eigenvalues used = %.3f\n",(float)(neig/((float)N))); + + for (j=0; j<N; j++) { + for (i=0; i<N; i++) { + U[j*N+i].r=S[j]*U[j*N+i].r; + U[j*N+i].i=-1.0*S[j]*U[j*N+i].i; + } + } + for (j=0; j<N; j++) { + for (i=0; i<N; i++) { + tmp.r = tmp.i = 0.0; + for (k=0; k<N; k++) { + a = U[k*N+j]; + b.r = VT[i*N+k].r; + b.i = -1.0*VT[i*N+k].i; + tmp.r += (a.r*b.r-a.i*b.i); + tmp.i += (a.r*b.i+a.i*b.r); + } + matrix[j*nxm+i] = tmp; + } + } + + free(U); + free(VT); + free(S); + free(work); + free(rwork); + free(iwork); + } + else if (rthm==4) { /* SVD general algorithm double precission most accurate */ + double *rwork, *S, *U, *VT, ar, ai, br, bi, tmpr, tmpi; + double S0,Si,*Mat,*dwork; + int neig; + char *jobu, *jobvt; + + energy=0.0; + if (eps_r != 0.0) { + for (i=0; i<nxm; i++) { + for (j=0; j<nxm; j++) { + tmp = matrix[i*nxm+j]; + energy += sqrt(tmp.r*tmp.r+tmp.i*tmp.i); + } + } + } + if (verbose>1) fprintf(stderr,"eps_r=%e eps_a=%e\n", eps_r*energy, eps_a); + /* add small value at diagonal */ + for (i=0; i<nxm; i++) { + tmp.r = eps_r*energy+eps_a; + matrix[i*nxm+i].r+=tmp.r; + } + + Mat = (double *)malloc(2*N*N*sizeof(double)); + /* convert to doubles */ + for (i=0; i<nxm; i++) { + for (j=0; j<nxm; j++) { + Mat[i*2*nxm+j*2] = (double)matrix[i*nxm+j].r; + Mat[i*2*nxm+j*2+1] = (double)matrix[i*nxm+j].i; + } + } + jobu = "A"; + jobvt = "A"; + lda = N = nxm; + lwork = N*8; + S = (double *)malloc(N*sizeof(double)); + U = (double *)malloc(2*N*N*sizeof(double)); + VT = (double *)malloc(2*N*N*sizeof(double)); + dwork = (double *)malloc(2*lwork*sizeof(double)); + rwork = (double *)malloc(5*N*sizeof(double)); + + /* Compute SVD */ + zgesvd_(jobu, jobvt, &N, &N, &Mat[0], &lda, S, &U[0], &lda, &VT[0], + &lda, &dwork[0], &lwork, rwork, &info); + assert (info == 0); + + if (eigenvalues) { + for (i=0; i<N; i++) { + eigen[i] = (float)S[i]; + } + } + + /* Compute inverse */ + S0 = S[0]; + neig = 0; + for (i=0; i<N; i++) { + if (verbose=4) fprintf(stderr,"S[%d] = %e ",i,S[i]); + Si = S[i]; + if ((Si/S0) > numacc) { S[i]=1.0/S[i]; neig++; } + else S[i] = 0.0; + /*S[i]=1.0/(S[i]+eps_r*S[0]);*/ +/* fprintf(stderr,"S^-1[%d] = %e\n",i,S[i]);*/ + } + if(verbose) fprintf(stderr,"fraction of eigenvalues used = %.3f\n",(float)(neig/((float)N))); + + for (j=0; j<N; j++) { + for (i=0; i<N; i++) { + U[j*2*N+2*i]=S[j]*U[j*2*N+2*i]; + U[j*2*N+2*i+1]=-1.0*S[j]*U[j*2*N+2*i+1]; + } + } + for (j=0; j<N; j++) { + for (i=0; i<N; i++) { + tmpr = tmpi = 0.0; + for (k=0; k<N; k++) { + ar = U[k*2*N+2*j]; + ai = U[k*2*N+2*j+1]; + br = VT[i*2*N+2*k]; + bi = -1.0*VT[i*2*N+2*k+1]; + tmpr += (ar*br-ai*bi); + tmpi += (ar*bi+ai*br); + } + matrix[j*nxm+i].r = (float)tmpr; + matrix[j*nxm+i].i = (float)tmpi; + } + } + + free(U); + free(VT); + free(S); + free(dwork); + free(rwork); + free(Mat); + } + else if (rthm==5) { /* double precission LU decomposition */ + int ispec, n1, nb; + char *name , *opts; + double *Mat, *dwork; + + ispec = 1; + name = "ZGETRI"; + n1 = nxm; + nb = ilaenv_(&ispec, name, opts, &n1, &n1, &n1, &n1); + nb = MAX(1,nb); + lwork = nb*nxm; + ipvt = (int *)malloc(nxm*sizeof(int)); + dwork = (double *)malloc(2*lwork*sizeof(double)); + Mat = (double *)malloc(2*N*N*sizeof(double)); + + energy=0.0; + if (eps_r != 0.0) { + for (i=0; i<nxm; i++) { + for (j=0; j<nxm; j++) { + tmp = matrix[i*nxm+j]; + energy += sqrt(tmp.r*tmp.r+tmp.i*tmp.i); + } + } + } + if (verbose>1) fprintf(stderr,"eps_r=%e eps_a=%e\n", eps_r*energy, eps_a); + /* convert to doubles */ + for (i=0; i<nxm; i++) { + for (j=0; j<nxm; j++) { + Mat[i*2*nxm+j*2] = (double)matrix[i*nxm+j].r; + Mat[i*2*nxm+j*2+1] = (double)matrix[i*nxm+j].i; + } + } + + /* add small value at diagonal */ + for (i=0; i<nxm; i++) { + Mat[i*2*nxm+i*2] +=eps_r*energy+eps_a; +// Mat[i*2*nxm+i*2+1]+=eps_r*energy+eps_a; + } + + /* LU based matrix inversion */ + zgetrf_(&nxm, &nxm, &Mat[0], &nxm, ipvt, &info); + if (info != 0) fprintf(stderr,"error in zgetrf %d at frequency %d\n", info, iw); + assert (info == 0); + zgetri_(&nxm, &Mat[0], &nxm, ipvt, &dwork[0], &lwork, &info); + if (info != 0) fprintf(stderr,"error in zgetri %d at frequency %d\n", info, iw); + assert (info == 0); + + /* convert back to floats */ + for (i=0; i<nxm; i++) { + for (j=0; j<nxm; j++) { + matrix[i*nxm+j].r = (float)Mat[i*2*nxm+j*2]; + matrix[i*nxm+j].i = (float)Mat[i*2*nxm+j*2+1]; + } + } + + free(ipvt); + free(dwork); + free(Mat); + } + else if (rthm==6) { /* eigenvalue decomposition */ + int *iwork; + int neig; + double *work, *vr, *vl; + double *rwork, *S, *U, *VT, ar, ai, br, bi, tmpr, tmpi; + double S0,Si,nxi,*Mat; + char *jobvl, *jobvr; + + jobvl = "V"; + jobvr = "V"; + lwork = N*N+2*N; + work = (double *)malloc(2*lwork*sizeof(double)); + rwork = (double *)malloc(N*2*sizeof(double)); + vr = (double *)malloc(2*N*N*sizeof(double)); + vl = (double *)malloc(2*N*N*sizeof(double)); + S = (double *)malloc(2*N*sizeof(double)); + U = (double *)malloc(2*N*N*sizeof(double)); + + Mat = (double *)malloc(2*N*N*sizeof(double)); + /* convert to doubles */ + for (i=0; i<nxm; i++) { + for (j=0; j<nxm; j++) { + Mat[i*2*nxm+j*2] = (double)matrix[i*nxm+j].r; + Mat[i*2*nxm+j*2+1] = (double)matrix[i*nxm+j].i; + } + } + + zgeev_(jobvl, jobvr, &N, Mat, &N, S, vl, &N, vr, &N, + work, &lwork, rwork, &info); + assert (info == 0); + + nxi = 1.0/N; + for (i=0; i<N; i++) { + S[2*i] = (float)S[2*i]*nxi; + S[2*i+1] = (float)S[2*i+1]*nxi; + } + + for (i=0; i<N; i++) { + for (j=0; j<N; j++) { + U[i*2*N+2*j] = (float)vr[(j)*2*N+2*i]; + U[i*2*N+2*j+1] = (float)vr[(i)*2*N+2*j+1]; + } + } + + /* Compute inverse */ + S0 = S[0]; + neig = 0; + for (i=0; i<N; i++) { +/* fprintf(stderr,"S[%d] = %e ",i,S[i]);*/ + Si = S[i]; + if ((Si/S0) > numacc) { S[i]=1.0/S[i]; neig++; } + else S[i] = 0.0; +/* fprintf(stderr,"S^-1[%d] = %e\n",i,S[i]);*/ + } + if(verbose) fprintf(stderr,"fraction of eigenvalues used = %.3f\n",(float)(neig/((float)N))); + + for (j=0; j<N; j++) { + for (i=0; i<N; i++) { + U[j*2*N+2*i]=S[j]*U[j*2*N+2*i]; + U[j*2*N+2*i+1]=-1.0*S[j]*U[j*2*N+2*i+1]; + } + } + for (j=0; j<N; j++) { + for (i=0; i<N; i++) { + tmpr = tmpi = 0.0; + for (k=0; k<N; k++) { + ar = U[k*2*N+2*j]; + ai = U[k*2*N+2*j+1]; + br = U[i*2*N+2*k]; + bi = U[i*2*N+2*k+1]; + tmpr += (ar*br-ai*bi); + tmpi += (ar*bi+ai*br); + } + matrix[j*nxm+i].r = (float)tmpr; + matrix[j*nxm+i].i = (float)tmpi; + } + } + + + free(work); + free(rwork); + free(vr); + free(Mat); + free(S); + free(U); + } + + return; +} + diff --git a/MDD/deconvolve.c b/MDD/deconvolve.c new file mode 100644 index 0000000..2ef6d49 --- /dev/null +++ b/MDD/deconvolve.c @@ -0,0 +1,192 @@ +#include <stdlib.h> +#include <stdio.h> +#include <assert.h> +#include <math.h> +#include <string.h> +#include<mkl_cblas.h> + +typedef struct { /* complex number */ + float r,i; +} complex; + +/* +cblas interface +void cgemm(const char *transa, const char *transb, const MKL_INT *m, const MKL_INT *n, const MKL_INT *k, + const MKL_Complex8 *alpha, const MKL_Complex8 *a, const MKL_INT *lda, + const MKL_Complex8 *b, const MKL_INT *ldb, const MKL_Complex8 *beta, + MKL_Complex8 *c, const MKL_INT *ldc); +*/ + +void cgemm_(char *transA, char *transb, int *M, int *N, int *K, float *alpha, float *A, int *lda, float *B, int *ldb, float *beta, float *C, int *ldc); +/* +CGEMM - perform one of the matrix-matrix operations C := alpha*op( A )*op( B ) + beta*C, + +Synopsis + +SUBROUTINE CGEMM ( TRANSA, TRANSB, M, N, K, ALPHA, A, LDA, B, LDB, BETA, C, LDC ) + +CHARACTER*1 TRANSA, TRANSB + +INTEGER M, N, K, LDA, LDB, LDC + +COMPLEX ALPHA, BETA + +COMPLEX A( LDA, * ), B( LDB, * ), C( LDC, * ) + +TRANSA - CHARACTER*1. On entry, TRANSA specifies the form of op( A ) to be used in the matrix multiplication as follows: + +TRANSA = 'N' or 'n', op( A ) = A. + +TRANSA = 'T' or 't', op( A ) = A'. + +TRANSA = 'C' or 'c', op( A ) = conjg( A' ). + +Unchanged on exit. + +TRANSB - CHARACTER*1. On entry, TRANSB specifies the form of op( B ) to be used in the matrix multiplication as follows: + +TRANSB = 'N' or 'n', op( B ) = B. + +TRANSB = 'T' or 't', op( B ) = B'. + +TRANSB = 'C' or 'c', op( B ) = conjg( B' ). + +Unchanged on exit. + +M - INTEGER. +On entry, M specifies the number of rows of the matrix op( A ) and of the matrix C. M must be at least zero. Unchanged on exit. + +N - INTEGER. +On entry, N specifies the number of columns of the matrix op( B ) and the number of columns of the matrix C. N must be at least zero. Unchanged on exit. + +K - INTEGER. +On entry, K specifies the number of columns of the matrix op( A ) and the number of rows of the matrix op( B ). K must be at least zero. Unchanged on exit. + +ALPHA - COMPLEX . +On entry, ALPHA specifies the scalar alpha. Unchanged on exit. + +A - COMPLEX array of DIMENSION ( LDA, ka ), where ka is k when TRANSA = 'N' or 'n', and is m otherwise. Before entry with TRANSA = 'N' or 'n', the leading m by k part of the array A must contain the matrix A, otherwise the leading k by m part of the array A must contain the matrix A. Unchanged on exit. + +LDA - INTEGER. +On entry, LDA specifies the first dimension of A as declared in the calling (sub) program. When TRANSA = 'N' or 'n' then LDA must be at least max( 1, m ), otherwise LDA must be at least max( 1, k ). Unchanged on exit. + +B - COMPLEX array of DIMENSION ( LDB, kb ), where kb is n when TRANSB = 'N' or 'n', and is k otherwise. Before entry with TRANSB = 'N' or 'n', the leading k by n part of the array B must contain the matrix B, otherwise the leading n by k part of the array B must contain the matrix B. Unchanged on exit. + +LDB - INTEGER. +On entry, LDB specifies the first dimension of B as declared in the calling (sub) program. When TRANSB = 'N' or 'n' then LDB must be at least max( 1, k ), otherwise LDB must be at least max( 1, n ). Unchanged on exit. + +BETA - COMPLEX . +On entry, BETA specifies the scalar beta. When BETA is supplied as zero then C need not be set on input. Unchanged on exit. + +C - COMPLEX array of DIMENSION ( LDC, n ). +Before entry, the leading m by n part of the array C must contain the matrix C, except when beta is zero, in which case C need not be set on entry. On exit, the array C is overwritten by the m by n matrix ( alpha*op( A )*op( B ) + beta*C ). + +LDC - INTEGER. +On entry, LDC specifies the first dimension of C as declared in the calling (sub) program. LDC must be at least max( 1, m ). Unchanged on exit. + +*/ + +void computeMatrixInverse(complex *matrix, int nxm, int rthm, float eps_a, float eps_r, float numacc, int eigenvalues, float *eigen, int iw, int verbose); + +int deconvolve(complex *cA, complex *cB, complex *cC, complex *oBB, int nfreq, int nblock, size_t nstationA, size_t nstationB, float eps_a, float eps_r, float numacc, int eigenvalues, float *eigen, int rthm, int mdd, int conjgA, int conjgB, int verbose) +{ + int istation, jstation, i, j, k, icc, ibb, NA, NB, NC, nshots; + size_t iwnA, iw, iwnB, iwAB, iwBB; + complex *AB, *BB; + char *transa, *transb,*transN; + complex beta, alpha, tmp, a, b; + + AB = (complex *)calloc(nstationA*nstationB,sizeof(complex)); + BB = (complex *)calloc(nstationB*nstationB,sizeof(complex)); + + if (conjgA == 1) transa = "C"; + else if (conjgA == 0) transa = "N"; + else transa = "T"; + if (conjgB == 1) transb = "C"; + else if(conjgB ==0) transb = "N"; + else transb = "T"; + transN = "N"; + alpha.r = 1.0; alpha.i = 0.0; + beta.r = 0.0; beta.i = 0.0; + nshots = nblock; + NA = nstationA; + NB = nstationB; + if (conjgA) NC = nshots; + else NC = nstationB; + +// if (verbose) fprintf(stderr,"transa=%s transb=%s %d %d %d\n", transa, transb, NA, NB, nshots); + +#pragma omp for schedule(static) \ +private(iw, iwnA, iwnB, iwAB, iwBB) + for (iw=0; iw< nfreq; iw++) { + + iwnA = iw*nstationA*nshots; + iwnB = iw*nstationB*nshots; + iwAB = iw*NC*NC; + if (mdd==0) { /* Correlation */ + /* cblas_cgemm(CblasRowMajor,CblasNoTrans, CblasConjTrans, NA, NB, nshots, &alpha.r, + &cA[iwnA].r, NA, + &cB[iwnB].r, NB, &beta.r, + &cC[iwAB].r, NC); */ + cgemm_(transa, transb, &NA, &NB, &nshots, &alpha.r, + &cA[iwnA].r, &NA, + &cB[iwnB].r, &NB, &beta.r, + &cC[iwAB].r, &NC); +// memcpy(&cC[iwAB].r, &cB[iwnA].r, sizeof(float)*2*nstationA*nshots); + } + else if (mdd==1) { /* Multi Dimensional deconvolution */ + /* compute AB^h and BB^h */ + iwBB = iw*nstationB*nstationB; + cgemm_(transa, transb, &NA, &NB, &nshots, &alpha.r, + &cA[iwnA].r, &NA, + &cB[iwnB].r, &NB, &beta.r, + &AB[0].r, &NA); + + cgemm_(transa, transb, &NB, &NB, &nshots, &alpha.r, + &cB[iwnB].r, &NB, + &cB[iwnB].r, &NB, &beta.r, + &BB[0].r, &NB); + + if (oBB!=NULL) memcpy(&oBB[iwBB].r, &BB[0].r, nstationB*nstationB*sizeof(complex)); + + /* compute inverse of BB^h as [BB^h+eps]^-1 */ + computeMatrixInverse(BB, NB, rthm, eps_a, eps_r, numacc, eigenvalues, &eigen[iw*NB], iw, verbose); + + /* multiply with AB to get Least Squares inversion */ + /* C = A/B => AB^h/(BB^h+eps) */ + cgemm_(transa, transa, &NA, &NB, &NB, &alpha.r, + &AB[0].r, &NA, + &BB[0].r, &NB, &beta.r, + &cC[iwAB].r, &NA); + } + else if (mdd==2) { /* Multi Dimensional deconvolution, but AB^H en BB^H already computed */ + + memcpy(&BB[0].r, &cB[iwnB].r, nstationB*nshots*sizeof(complex)); + + computeMatrixInverse(BB, NB, rthm, eps_a, eps_r, numacc, eigenvalues, &eigen[iw*NB], iw, verbose); + + transN = "N"; + transN = "N"; + cgemm_(transN, transN, &NA, &NB, &NB, &alpha.r, + &cA[iwnA].r, &NA, + &BB[0].r, &NB, &beta.r, + &cC[iwAB].r, &NA); + } + else if (mdd==3) { /* Copy matrix A or B to memory for testing purposes */ + memcpy(&cC[iwAB].r, &cA[iwnA].r, sizeof(complex)*nstationA*nshots); + } + else if (mdd==4) { + memcpy(&cC[iwAB].r, &cB[iwnB].r, sizeof(complex)*nstationB*nshots); + } + else if (mdd==5) { + cblas_cdotu_sub(nshots, &cA[iwnA].r, NA, &cB[iwnB].r, NB, &cC[iwnA].r); + } + + } + + free(AB); + free(BB); + + return 0; +} + diff --git a/MDD/docpkge.c b/MDD/docpkge.c new file mode 120000 index 0000000..5384bb3 --- /dev/null +++ b/MDD/docpkge.c @@ -0,0 +1 @@ +../utils/docpkge.c \ No newline at end of file diff --git a/MDD/getFileInfo.c b/MDD/getFileInfo.c new file mode 120000 index 0000000..ae38ea2 --- /dev/null +++ b/MDD/getFileInfo.c @@ -0,0 +1 @@ +../utils/getFileInfo.c \ No newline at end of file diff --git a/MDD/getpars.c b/MDD/getpars.c new file mode 120000 index 0000000..fa7dc33 --- /dev/null +++ b/MDD/getpars.c @@ -0,0 +1 @@ +../utils/getpars.c \ No newline at end of file diff --git a/MDD/mdd.c b/MDD/mdd.c new file mode 100644 index 0000000..93a6e27 --- /dev/null +++ b/MDD/mdd.c @@ -0,0 +1,593 @@ +#include <stdio.h> +#include <stdlib.h> +#include <assert.h> +#include <math.h> +#include "par.h" +#include "segy.h" + +#define MIN(x,y) ((x) < (y) ? (x) : (y)) +#define MAX(x,y) ((x) > (y) ? (x) : (y)) +#define NINT(x) ((int)((x)>0.0?(x)+0.5:(x)-0.5)) + +#ifdef _OPENMP +int omp_get_thread_num(void); +#endif +double wallclock_time(void); +void name_ext(char *filename, char *extension); + +typedef struct { /* complex number */ + float r,i; +} complex; + +void cr1fft(complex *cdata, float *rdata, int n, int sign); +int optncr(int n); + +int getFileInfo(char *filename, int *n1, int *n2, int *ngath, float *d1, float *d2, float *f1, float *f2, float *xmin, float *xmax, float *sclsxgx, int *nxm); + +int readShotData(char *filename, float xmin, float dx, float *xrcv, float *xsrc, int *xnx, complex *cdata, int nw, int nw_low, int ngath, int nx, int nxm, int ntfft, float alpha, float scl, float conjg, int transpose, int verbose); + +int deconvolve(complex *cA, complex *cB, complex *cC, complex *oBB, int nfreq, int nblock, size_t nstationA, size_t nstationB, float eps_a, float eps_r, float numacc, int eigenvalues, float *eigen, int rthm, int mdd, int conjgA, int conjgB, int verbose); + +void writeEigen(char *file_out, float df, int nw_low, int nw_high, int nw, float *eigen, int nx, float dx, float xmin); +void writeDatamatrix(char *file_out, complex *P, int ntfft, int ntc, int Nrec, int Nshot, int nfreq, int nw_low, float dt, int verbose); + +void gausstaper(float *taper, float dx, int n, float enddecay); + +/************** +* ntc output samples of deconvolution result +* note that nt (the number of samples read by the IO routine) +* should be 2*ntc and a number efficient for FFT's +*/ + +/*********************** self documentation **********************/ +char *sdoc[] = { +" ", +" mdd - multi-dimensional deconvolution (OpenMP)", +" ", +" mdd file_A= file_B= file_out= [optional parameters]", +" ", +" Required parameters: ", +" ", +" file_A= .................. name of file(s) which store the data in location A", +" file_B= .................. name of file(s) which store the data in location B", +" ", +" Optional parameters: ", +" ", +" ntc=nt ................... number of output time samples", +" ntfft=nt ................. number of samples used in fft", +" fmin=0 ................... minimum frequency", +" fmax=70 .................. maximum frequency to use in deconvolution", +" INPUT DEFINITION ", +" cjA=1 .................... -1 => apply complex conjugate to A", +" sclA=1 ................... apply scaling factor to A", +" tranposeA=0 .............. apply transpose to A", +" cjB=1 .................... -1 => apply complex conjugate to B", +" sclB=1 ................... apply scaling factor to B", +" tranposeB=0 .............. apply transpose to B", +" MATRIX INVERSION CALCULATION ", +" conjgA=0 ................. apply complex conjugate-transpose to A", +" conjgB=1 ................. apply complex conjugate-transpose to B", +" rthm=0 ................... see below for options", +" eps_a=1e-5 ............... absolute stabilization factor for LS", +" eps_r=1e-4 ............... relative stabilization factor for LS", +" numacc=1e-6 .............. numerical accurary for SVD", +" ntap=0 ................... number of taper points matrix", +" ftap=0 ................... percentage for tapering", +" tap=0 .................... type of taper: 0=cos 1=exp", +" eigenvalues= ............. write SVD eigenvalues to file ", +" mdd=1 .................... mdd=0 => computes correlation ", +" OUTPUT DEFINITION ", +" file_out= ................ output base name ", +" causal=1 ................. output causal(1), non-causal(2), both(3), or summed(4)", +" one_file=1 ............... write all shots into one file ", +" file_dmat= ............... if defined writes matrix in frequency domain", +" verbose=0 ................ silent option; >0 displays info", +" ", +" Notes: ", +" ntc output samples of deconvolution result", +" nt (the number of samples read by the IO routine)", +" ", +" Options for mdd= ", +" 2 = A/(B + eps) ", +" 1 = A*B^H/(B*B^H + eps) ", +" 0 = A*B^H ", +" ", +" Option for rthm= ", +" 0 = Least Squares QR based inversion", +" 1 = Least Squares LU based inversion", +" 2 = SVD inversion single precision", +" 3 = SVD divide-and-conquer method", +" 4 = SVD inversion double precision", +" 5 = Least Squares LU based inversion double precision", +" 6 = Eigenvalue based (not yet working)", +" ", +" author : Jan Thorbecke : 2008 (j.w.thorbecke@tudelft.nl)", +" ", +NULL}; +/**************** end self doc ***********************************/ + +int main (int argc, char **argv) +{ + FILE *fpin, *fpout; + int i, j, k, ret, nshots, ntraces; + int size, n1, n2, ntfft, nf, causal; + int verbose, fullcorr, ncorstat, err; + int nt, nc, ncc, ntc, nshotA, nshotB; + size_t nstationA, nstationB, nfreq, istation, jstation, iw; + int pgsz, istep,jstep; + int mdd; + int conjgA, conjgB; + int ntap, nxm, ngath, nw, nw_low, nw_high, eigenvalues, rthm, combine, distance; + size_t nwrite, cdatainSize, datainSize, cdataoutSize, stationSize, is; + float dx, dt, fmin, fmax, df, eps_r, eps_a, ftap, numacc; + float *rC, scl, *rl, *eigen; + float f1, f2, d1, d2, sclsxgx, xmin, xmax, alpha, wshot, wpi, wrec; + float *xrcvA, *xsrcA, *xrcvB, *xsrcB; + float *taper; + int *xnx; + float sclA,sclB, cjA, cjB; + int transposeA, transposeB; + + + complex *cdataout; + double t0, t1, t2, t3, tinit, twrite, tread, tdec, tfft; + char *file_A, *file_B, *file_out, *file_dmat, filename[1024], number[128], *rthmName; + int pe=0, root_pe=0, npes=1, ipe, size_s, one_file; + complex *cA, *cB, *oBB; + segy *hdr; + + t0 = wallclock_time(); + initargs(argc, argv); + requestdoc(1); + + if (!getparint("verbose", &verbose)) verbose = 0; + if (!getparstring("file_A", &file_A)) file_A=NULL; + assert(file_A != NULL); + if (!getparstring("file_B", &file_B)) file_B=NULL; + assert(file_B != NULL); + if (!getparstring("file_out", &file_out)) file_out=NULL; + if (!getparstring("file_dmat", &file_dmat)) file_dmat=NULL; + if (!getparint("one_file", &one_file)) one_file = 1; + + if (!getparfloat("fmin", &fmin)) fmin = 0.0; + if (!getparint("rthm", &rthm)) rthm = 0; + if (!getparint("combine", &combine)) combine = 0; + if (!getparint("causal", &causal)) causal = 1; + if (!getparint("ntap", &ntap)) ntap = 0; + if (!getparfloat("ftap", &ftap)) ftap = 0.; + if (!getparfloat("eps_r", &eps_r)) eps_r = 1e-4; + if (!getparfloat("eps_a", &eps_a)) eps_a = 1e-5; + if (!getparfloat("numacc", &numacc)) numacc = 1e-6; + if (!getparint("eigenvalues", &eigenvalues)) eigenvalues = 0; + if (!getparint("mdd", &mdd)) mdd = 1; + + if (!getparint("transposeA", &transposeA)) transposeA = 0; + if (!getparfloat("sclA", &sclA)) sclA = 1.; + if (!getparfloat("cjA", &cjA)) cjA = 1.; + if (!getparint("transposeB", &transposeB)) transposeB = 0; + if (!getparfloat("sclB", &sclB)) sclB = 1.; + if (!getparfloat("cjB", &cjB)) cjB = 1.; + +#ifdef _OPENMP + npes = atoi(getenv("OMP_NUM_THREADS")); + assert(npes != 0); + if (verbose) fprintf(stderr,"Number of OpenMP thread's is %d\n", npes); +#else + npes=1; +#endif + +/* get information from input files */ + + nshotA = 0; + getFileInfo(file_A, &n1, &n2, &nshotA, &d1, &d2, &f1, &f2, &xmin, &xmax, &sclsxgx, &nxm); + if (!getparint("nt", &nt)) nt=n1; + if (!getparint("ntc", &ntc)) ntc = n1; + if (!getparint("conjgA", &conjgA)) conjgA = 0; + if (!getparint("conjgB", &conjgB)) conjgB = 1; + if (!getparfloat("dt", &dt)) dt = d1; + if (!getparfloat("dx", &dx)) dx = d2; + if (!getparfloat("fmax", &fmax)) fmax = 1.0/(2.0*dt); + + nstationA = n2; + + nshotB = 0; + getFileInfo(file_B, &n1, &n2, &nshotB, &d1, &d2, &f1, &f2, &xmin, &xmax, &sclsxgx, &nxm); + assert( n1 == nt); + nstationB = n2; + assert( nshotA == nshotB); + +/*================ initializations ================*/ + + tinit = 0.0; + tfft = 0.0; + tread = 0.0; + tdec = 0.0; + + if (!getparint("ntfft", &ntfft)) ntfft = nt; + ntfft = optncr(ntfft); + nf = ntfft/2+1; + df = 1.0/(ntfft*dt); + nw_high = MIN( (int)((fmax)/df), nf ); + nw_low = MAX( (int)(fmin/df), 1 ); + nw = nw_high - nw_low + 1; + nfreq = MIN(nf,nw); + +/* scaling of the results by Johno van IJsseldijk */ + if (mdd == 0) scl = dx*dt/((float)ntfft); //correlation + else if (mdd==1) scl = 1/((float)ntfft)/dx/dt; // MDD + else if (mdd==2) scl = 1/((float)ntfft)/dx/dt; // MDD with A and B already computed (NOT TESTED) + else scl = 1.0/((float)ntfft); // Passing A or B through + +/* allocate in shared memory the in- and output data */ + + jstep = nfreq*nshotA; + cdatainSize = nfreq*nshotA*sizeof(complex); + cdataoutSize = nstationA*nstationB*nfreq*sizeof(complex); + cdataout = (complex *)malloc(cdataoutSize); + cA = (complex *)malloc(nstationA*cdatainSize); + cB = (complex *)malloc(nstationB*cdatainSize); + taper = (float *)malloc(2*nstationB*sizeof(float)); + if (file_dmat!=NULL) oBB = (complex *)malloc(nstationB*nstationB*nfreq*sizeof(complex)); + else oBB = NULL; + assert(cdataout != NULL); + assert(cA != NULL); + assert(cB != NULL); + + +/* for first touch binding of allocated memory */ +#pragma omp parallel for schedule(static) private(jstation,is) default(shared) + for (jstation=0; jstation<nstationB; jstation++) { + stationSize=nstationA*nfreq*sizeof(complex); + is = jstation*nstationA*nfreq; + memset(&cdataout[is],0,stationSize); + memset(&cB[jstation*jstep],0,jstep*sizeof(complex)); + } + +#pragma omp parallel for schedule(static) private(jstation) default(shared) + for (jstation=0; jstation<nstationA; jstation++) { + memset(&cA[jstation*jstep],0,jstep*sizeof(complex)); + } + + if (verbose) { + if (rthm==0) rthmName="Cholesky"; + else if (rthm==1) rthmName="LU"; + else if (rthm==2) rthmName="SVD single precision"; + else if (rthm==3) rthmName="SVD divide-and-conquer"; + else if (rthm==4) rthmName="SVD double precision"; + else if (rthm==5) rthmName="LU double precision"; + else if (rthm==6) rthmName="Eigenvalue double precision"; + fprintf(stderr,"--- Input Information ---\n"); + fprintf(stderr," dt nt ............ : %f : %d\n", dt, nt); + fprintf(stderr," dx ............... : %f\n", dx); + fprintf(stderr," nshotA ........... : %d\n", nshotA ); + fprintf(stderr," nstationA ........ : %ld\n", nstationA ); + fprintf(stderr," nshotB ........... : %d\n", nshotB ); + fprintf(stderr," nstationB ........ : %ld\n", nstationB ); + fprintf(stderr," number t-fft ..... : %d\n", ntfft); + fprintf(stderr," Input size ...... : %ld MB\n", (nstationA+nstationB)*cdatainSize/(1024*1024)); + fprintf(stderr," Output size ...... : %ld MB\n", (cdataoutSize/((size_t)1024*1024))); + fprintf(stderr," taper points ..... : %d (%.2f %%)\n", ntap, ftap*100.0); + fprintf(stderr," process number ... : %d\n", pe); + fprintf(stderr," fmin ............. : %.3f (%d)\n", fmin, nw_low); + fprintf(stderr," fmax ............. : %.3f (%d)\n", fmax, nw_high); + fprintf(stderr," nfreq ........... : %ld\n", nfreq); + if (mdd) fprintf(stderr," Matrix inversion . : %s\n", rthmName); + else fprintf(stderr," Correlation ...... : \n"); + fprintf(stderr," eps_r ............ : %e\n", eps_r); + fprintf(stderr," eps_a ............ : %e\n", eps_a); + fprintf(stderr," mdd .............. : %d\n", mdd); + } + + t1 = wallclock_time(); + tinit += t1-t0; + +/* read in first nt samples, and store in data */ + + xsrcA = (float *)calloc(nshotA,sizeof(float)); + xrcvA = (float *)calloc(nshotA*nstationA,sizeof(float)); + xnx = (int *)calloc(nshotA,sizeof(int)); + alpha = 0.0; + readShotData(file_A, xmin, dx, xrcvA, xsrcA, xnx, cA, nw, nw_low, nshotA, nstationA, nstationA, ntfft, alpha, sclA, cjA, transposeA, verbose); + + xsrcB = (float *)calloc(nshotB,sizeof(float)); + xrcvB = (float *)calloc(nshotB*nstationB,sizeof(float)); + alpha = 0.0; + readShotData(file_B, xmin, dx, xrcvB, xsrcB, xnx, cB, nw, nw_low, nshotB, nstationB, nstationB, ntfft, alpha, sclB, cjB, transposeB, verbose); + + //cB = cA; + + eigen = (float *)malloc(nfreq*nstationB*sizeof(float)); + + t2 = wallclock_time(); + tread += t2-t1; + +#pragma omp parallel default(none) \ + private(t1,t2,pe) \ + shared(cA,cB,eigen,eigenvalues,numacc,eps_r,eps_a) \ + shared(nstationA,nstationB,verbose,cdatainSize) \ + shared(rthm,mdd,nfreq,nshotA,conjgA,conjgB) \ + shared(cdataout,oBB) +{ /* start of OpenMP parallel part */ + + +#ifdef _OPENMP + pe = omp_get_thread_num(); +#endif + + /* compute deconvolution */ + deconvolve(cA, cB, cdataout, oBB, nfreq, nshotA, nstationA, nstationB, + eps_a, eps_r, numacc, eigenvalues, eigen, rthm, mdd, conjgA, conjgB, verbose); + +} /*end of parallel OpenMP part */ + + fflush(stderr); + fflush(stdout); + + t3 = wallclock_time(); + tdec += t3-t2; + if (verbose>=1) { + fprintf(stderr,"************* PE %d ************* \n", pe); + fprintf(stderr,"CPU-time read data = %.3f\n", tread); + fprintf(stderr,"CPU-time deconvolution = %.3f\n", tdec); + } + +/* for writing out combined shots cA */ + free(cA); + free(cB); + +/* Inverse FFT of deconvolution results */ +/* This is done for every deconvolution component seperately */ + + rC = (float *)malloc(nstationA*ntc*sizeof(float)); + assert(rC != NULL); + +/* +#pragma omp parallel default(none) \ + private(istation,jstation,pe,j,i,t1,t2,t3,hdr,rl) \ + private(filename, k, fpout, nwrite, cA, iw,number) \ + shared(tfft) \ + shared(rC,dt,ntc,file_out) \ + shared(nt,nstationA,nstationB,verbose,err,ntfft,t0,twrite) \ + shared(nfreq,stderr,stdout, nshotA, nshotB, nw_low, causal) \ + shared(cdataout,istep,jstep,one_file) +*/ +//{ /* start of OpenMP parallel part */ +//#ifdef _OPENMP +// pe = omp_get_thread_num(); +//#else + pe = 0; +//#endif + + rl = (float *)calloc(ntfft,sizeof(float)); + cA = (complex *)calloc(ntfft,sizeof(complex)); + hdr = (segy *)calloc(1,sizeof(segy)); + +/* for writing out combined shots cA */ + + tfft = 0.0; + twrite = 0.0; + if (one_file && pe==0) { + strcpy(filename, file_out); + if (verbose>2) fprintf(stderr,"writing all output shot into file %s\n", filename); + fpout = fopen( filename, "w+" ); + } +//#pragma omp for + for (jstation=0; jstation<nstationB; jstation++) { + /* FFT */ + t1 = wallclock_time(); + for (istation=0; istation<nstationA; istation++) { + memset(cA,0,ntfft*sizeof(complex)); + for (iw=0;iw<nfreq;iw++) { + cA[iw+nw_low].r = cdataout[(iw*nstationB+jstation)*nstationA+istation].r*scl; + cA[iw+nw_low].i = cdataout[(iw*nstationB+jstation)*nstationA+istation].i*scl; + } + cr1fft(cA, rl, ntfft, 1); + memcpy(&rC[istation*ntc],rl,ntc*sizeof(float)); + + if (causal==1) { + memcpy(&rC[istation*ntc],rl,ntc*sizeof(float)); + } + else if (causal==2) { + rC[istation*ntc] = rl[0]; + for (j=1;j<ntc; j++) { + rC[istation*ntc+j] = rl[ntfft-j]; + } + } + else if (causal==3) { + for (j=1;j<=(ntc/2); j++) { + rC[istation*ntc+ntc/2-j] = rl[ntfft-j]; + } + for (j=ntc/2;j<ntc; j++) { + rC[istation*ntc+j] = rl[j-ntc/2]; + } + } + else if (causal==4) { + rC[istation*ntc] = rl[0]; + for (j=1;j<ntc; j++) { + rC[istation*ntc+j] = rl[ntfft-j] + rl[j]; + } + } + } + t2 = wallclock_time(); + tfft += t2-t1; + + if (pe == 0) { + /* write data to file */ + hdr[0].d1 = dt; + if (causal == 3) hdr[0].f1=-0.5*ntc*dt; + else hdr[0].f1=0.0; + hdr[0].dt = (int)(dt*1000000); + hdr[0].ns = ntc; + hdr[0].fldr = jstation+1; + hdr[0].scalco = -1000; + hdr[0].scalel = -1000; + hdr[0].trid = 1; + hdr[0].f2 = f2; + hdr[0].d2 = dx; +// hdr[0].trwf = nstationA; + hdr[0].sx = NINT((f2+dx*jstation)*1000); + hdr[0].ntr = nstationA*nstationB; + if (!one_file) { + strcpy(filename, file_out); + sprintf(number,"Station%03d\0",jstation+1); + name_ext(filename, number); + if (verbose>3) fprintf(stderr,"writing to file %s\n", filename); + fpout = fopen( filename, "w+" ); + } + for (istation=0; istation<nstationA; istation++) { + hdr[0].tracl = istation+1; + hdr[0].gx = NINT((f2+dx*istation)*1000); + hdr[0].offset = NINT((f2+dx*istation)); + nwrite = fwrite( hdr, 1, TRCBYTES, fpout ); + assert (nwrite == TRCBYTES); + nwrite = fwrite( &rC[istation*ntc], sizeof(float), ntc, fpout ); + assert (nwrite == ntc); + } + if (!one_file) { + fflush(fpout); + fclose(fpout); + } + t3 = wallclock_time(); + twrite += t3-t2; +// fprintf(stderr,"write %f and fft %f for %d\n",twrite, tfft, jstation); + } + } + if (one_file && pe==0) { + fflush(fpout); + fclose(fpout); + } + free(cA); + free(rl); +//} + + free(rC); + free(cdataout); + + if (eigenvalues) { + writeEigen(file_out, df, nw_low, nw_high, nfreq, eigen, nstationB, dx, f2); + } + free(eigen); + + /* if file_dmat write frequency slices of matrix */ + if (file_dmat!=NULL) { + t2 = wallclock_time(); + strcpy(filename, file_dmat); + fpout = fopen( filename, "w+" ); + hdr[0].d1 = df; + hdr[0].dt = (int)(df*1000000); + hdr[0].ns = nfreq; + hdr[0].trid = 111; +/* + for (iw=0;iw<nfreq;iw++) { + hdr[0].fldr = iw+1; +// sprintf(number,"Station%03d\0",jstation+1); +// name_ext(filename, number); +// if (verbose>3) fprintf(stderr,"writing to file %s\n", filename); +// fpout = fopen( filename, "w+" ); + twrite = 0.0; + for (istation=0; istation<nstationB; istation++) { + hdr[0].tracl = istation+1; + nwrite = fwrite( hdr, 1, TRCBYTES, fpout ); + assert (nwrite == TRCBYTES); +// nwrite = fwrite( &oBB[iw*nstationB*nstationB+istation].r, sizeof(complex), nfreq, fpout ); +// assert (nwrite == nfreq); + } + } +*/ + fflush(fpout); + fclose(fpout); + t3 = wallclock_time(); + twrite += t3-t2; + free(oBB); + } + free(hdr); + +/*================ end ================*/ + + if (verbose) { + t3 = wallclock_time(); + fprintf(stderr,"CPU-time inverse FFT's = %.3f\n", tfft); + fprintf(stderr,"CPU-time write data = %.3f\n", twrite); + fprintf(stderr,"CPU-time initialization = %.3f\n", tinit); + fprintf(stderr,"Total CPU-time = %.3f\n", t3-t0); + } + + return 0; +} + +void gausstaper(float *taper, float dx, int n, float enddecay) +{ + int ix, hn; + float dist, sigma2; + + if (enddecay > 0.999) { + for (ix = 0; ix < n; ix++) taper[ix] = 1.0; + return; + } + + hn = (n-1)/2; + sigma2 = (hn*dx*hn*dx)/(log(enddecay)); + + for (ix = 0; ix <= hn; ix++) { + dist = ix*dx; + taper[hn+ix] = exp(dist*dist/sigma2); + } + + for (ix = 0; ix < hn; ix++) + taper[ix] = taper[n-1-ix]; + + return; +} + +void writeDatamatrix(char *file_out, complex *P, int ntfft, int ntc, int Nrec, int Nshot, int nfreq, int nw_low, float dt, int verbose) +{ + FILE *fpout; + char filename[1024]; + size_t nwrite; + int jstation, istation, iw; + float *rl, *rC; + complex *cA; + segy *hdr; + + rC = (float *)malloc(Nrec*ntc*sizeof(float)); + rl = (float *)calloc(ntfft,sizeof(float)); + cA = (complex *)calloc(ntfft,sizeof(complex)); + hdr = (segy *)calloc(1,sizeof(segy)); + +/* for writing out combined shots cA */ + + strcpy(filename, file_out); + if (verbose>2) fprintf(stderr,"writing all output shot into file %s\n", filename); + fpout = fopen( file_out, "w+" ); + for (jstation=0; jstation<Nshot; jstation++) { + + /* FFT */ + for (istation=0; istation<Nrec; istation++) { + memset(cA,0,ntfft*sizeof(complex)); + for (iw=0;iw<nfreq;iw++) { + cA[iw+nw_low] = P[(iw*Nshot+jstation)*Nrec+istation]; + } + cr1fft(cA, rl, ntfft, 1); + memcpy(&rC[istation*ntc],rl,ntc*sizeof(float)); + } + + /* write data to file */ + hdr[0].d1 = dt; + hdr[0].dt = (int)(dt*1000000); + hdr[0].ns = ntc; + hdr[0].fldr = jstation+1; + for (istation=0; istation<Nrec; istation++) { + hdr[0].tracl = istation+1; + nwrite = fwrite( hdr, 1, TRCBYTES, fpout ); + assert (nwrite == TRCBYTES); + nwrite = fwrite( &rC[istation*ntc], sizeof(float), ntc, fpout ); + assert (nwrite == ntc); + } + } + + free(cA); + free(rl); + free(rC); + return; +} + diff --git a/MDD/name_ext.c b/MDD/name_ext.c new file mode 120000 index 0000000..83ac1f8 --- /dev/null +++ b/MDD/name_ext.c @@ -0,0 +1 @@ +../utils/name_ext.c \ No newline at end of file diff --git a/MDD/par.h b/MDD/par.h new file mode 120000 index 0000000..0fa273c --- /dev/null +++ b/MDD/par.h @@ -0,0 +1 @@ +../utils/par.h \ No newline at end of file diff --git a/MDD/readShotData.c b/MDD/readShotData.c new file mode 100644 index 0000000..ce77436 --- /dev/null +++ b/MDD/readShotData.c @@ -0,0 +1,142 @@ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <math.h> +#include "segy.h" +#include <assert.h> + +extern FILE *fopen64 (__const char *__restrict __filename, + __const char *__restrict __modes); + +typedef struct { /* complex number */ + float r,i; +} complex; + +#define NINT(x) ((int)((x)>0.0?(x)+0.5:(x)-0.5)) + +int optncr(int n); +void cc1fft(complex *data, int n, int sign); +void rc1fft(float *rdata, complex *cdata, int n, int sign); + +int compare(const void *a, const void *b) +{ return (*(float *)b-*(float *)a); } + +int readShotData(char *filename, float xmin, float dx, float *xrcv, float *xsrc, int *xnx, complex *cdata, int nw, int nw_low, int ngath, int nx, int nxm, int ntfft, float alpha, float scale, float conjg, int transpose, int verbose) +{ + FILE *fp; + segy hdr; + size_t nread; + int fldr_shot, sx_shot, itrace, one_shot, igath, iw, i, j, k; + int end_of_file, nt, ir, is; + float scl, dt, *trace; + complex *ctrace; + + /* Reading first header */ + + if (filename == NULL) fp = stdin; + else fp = fopen64( filename, "r" ); + if ( fp == NULL ) { + fprintf(stderr,"input file %s has an error\n", filename); + perror("error in opening file: "); + fflush(stderr); + return -1; + } + + fseek(fp, 0, SEEK_SET); + nread = fread( &hdr, 1, TRCBYTES, fp ); + assert(nread == TRCBYTES); + if (hdr.scalco < 0) scl = 1.0/fabs(hdr.scalco); + else if (hdr.scalco == 0) scl = 1.0; + else scl = hdr.scalco; + fseek(fp, 0, SEEK_SET); + + nt = hdr.ns; + + trace = (float *)calloc(nx*ntfft,sizeof(float)); + ctrace = (complex *)malloc(ntfft*sizeof(complex)); + + end_of_file = 0; + one_shot = 1; + igath = 0; + + /* Read shots in file */ + + while (!end_of_file) { + + /* start reading data (shot records) */ + itrace = 0; + nread = fread( &hdr, 1, TRCBYTES, fp ); + if (nread != TRCBYTES) { /* no more data in file */ + break; + } + + sx_shot = hdr.sx; + fldr_shot = hdr.fldr; + xsrc[igath] = sx_shot*scl; + xnx[igath]=0; + /* read in all traces within a shot */ + while (one_shot) { + xrcv[igath*nxm+itrace] = hdr.gx*scl; + nread = fread( &trace[itrace*ntfft], sizeof(float), nt, fp ); + assert (nread == hdr.ns); + itrace++; + xnx[igath]+=1; + + /* read next hdr of next trace */ + nread = fread( &hdr, 1, TRCBYTES, fp ); + if (nread != TRCBYTES) { + one_shot = 0; + end_of_file = 1; + break; + } + if ((sx_shot != hdr.sx) || (fldr_shot != hdr.fldr) ) break; + } + + for (i=0; i<itrace; i++) { + /* apply alpha factor */ + if (alpha != 0.0) { + for (j=0; j<nt; j++) { + trace[i*ntfft+j] *= exp(alpha*j*dt); + } + } + for (j=nt; j<ntfft; j++) { + trace[i*ntfft+j] = 0.0; + } + + /* transform to frequency domain */ + rc1fft(&trace[i*ntfft],ctrace,ntfft,-1); + + if (transpose == 0) { + for (iw=0; iw<nw; iw++) { + cdata[iw*ngath*nx+igath*nx+i].r = scale*ctrace[nw_low+iw].r; + cdata[iw*ngath*nx+igath*nx+i].i = conjg*scale*ctrace[nw_low+iw].i; + } + } + else { + for (iw=0; iw<nw; iw++) { + cdata[iw*ngath*nx+i*ngath+igath].r = scale*ctrace[nw_low+iw].r; + cdata[iw*ngath*nx+i*ngath+igath].i = conjg*scale*ctrace[nw_low+iw].i; + } + } + } + + if (verbose>2) { + fprintf(stderr,"finished reading shot %d (%d) with %d traces\n",sx_shot,igath,itrace); + } + + if (itrace != 0) { /* end of shot record */ + fseek( fp, -TRCBYTES, SEEK_CUR ); + igath++; + } + else { + end_of_file = 1; + } + } + + free(ctrace); + free(trace); + + return 0; +} + + diff --git a/MDD/segy.h b/MDD/segy.h new file mode 100644 index 0000000..d0a0d76 --- /dev/null +++ b/MDD/segy.h @@ -0,0 +1,849 @@ +/* Copyright (c) Colorado School of Mines, 2011.*/ +/* All rights reserved. */ + +/* segy.h - include file for SEGY traces + * + * declarations for: + * typedef struct {} segy - the trace identification header + * typedef struct {} bhed - binary header + * + * Note: + * If header words are added, run the makefile in this directory + * to recreate hdr.h. + * + * Reference: + * K. M. Barry, D. A. Cavers and C. W. Kneale, "Special Report: + * Recommended Standards for Digital Tape Formats", + * Geophysics, vol. 40, no. 2 (April 1975), P. 344-352. + * + * $Author: john $ + * $Source: /usr/local/cwp/src/su/include/RCS/segy.h,v $ + * $Revision: 1.33 $ ; $Date: 2011/11/11 23:56:14 $ + */ + +#include <limits.h> +#include "par.h" + +#ifndef SEGY_H +#define SEGY_H +#define TRCBYTES 240 + +#define SU_NFLTS 32767 /* Arbitrary limit on data array size */ + + +/* TYPEDEFS */ +typedef struct { /* segy - trace identification header */ + + int tracl; /* Trace sequence number within line + --numbers continue to increase if the + same line continues across multiple + SEG Y files. + byte# 1-4 + */ + + int tracr; /* Trace sequence number within SEG Y file + ---each file starts with trace sequence + one + byte# 5-8 + */ + + int fldr; /* Original field record number + byte# 9-12 + */ + + int tracf; /* Trace number within original field record + byte# 13-16 + */ + + int ep; /* energy source point number + ---Used when more than one record occurs + at the same effective surface location. + byte# 17-20 + */ + + int cdp; /* Ensemble number (i.e. CDP, CMP, CRP,...) + byte# 21-24 + */ + + int cdpt; /* trace number within the ensemble + ---each ensemble starts with trace number one. + byte# 25-28 + */ + + short trid; /* trace identification code: + -1 = Other + 0 = Unknown + 1 = Seismic data + 2 = Dead + 3 = Dummy + 4 = Time break + 5 = Uphole + 6 = Sweep + 7 = Timing + 8 = Water break + 9 = Near-field gun signature + 10 = Far-field gun signature + 11 = Seismic pressure sensor + 12 = Multicomponent seismic sensor + - Vertical component + 13 = Multicomponent seismic sensor + - Cross-line component + 14 = Multicomponent seismic sensor + - in-line component + 15 = Rotated multicomponent seismic sensor + - Vertical component + 16 = Rotated multicomponent seismic sensor + - Transverse component + 17 = Rotated multicomponent seismic sensor + - Radial component + 18 = Vibrator reaction mass + 19 = Vibrator baseplate + 20 = Vibrator estimated ground force + 21 = Vibrator reference + 22 = Time-velocity pairs + 23 ... N = optional use + (maximum N = 32,767) + + Following are CWP id flags: + + 109 = autocorrelation + 110 = Fourier transformed - no packing + xr[0],xi[0], ..., xr[N-1],xi[N-1] + 111 = Fourier transformed - unpacked Nyquist + xr[0],xi[0],...,xr[N/2],xi[N/2] + 112 = Fourier transformed - packed Nyquist + even N: + xr[0],xr[N/2],xr[1],xi[1], ..., + xr[N/2 -1],xi[N/2 -1] + (note the exceptional second entry) + odd N: + xr[0],xr[(N-1)/2],xr[1],xi[1], ..., + xr[(N-1)/2 -1],xi[(N-1)/2 -1],xi[(N-1)/2] + (note the exceptional second & last entries) + 113 = Complex signal in the time domain + xr[0],xi[0], ..., xr[N-1],xi[N-1] + 114 = Fourier transformed - amplitude/phase + a[0],p[0], ..., a[N-1],p[N-1] + 115 = Complex time signal - amplitude/phase + a[0],p[0], ..., a[N-1],p[N-1] + 116 = Real part of complex trace from 0 to Nyquist + 117 = Imag part of complex trace from 0 to Nyquist + 118 = Amplitude of complex trace from 0 to Nyquist + 119 = Phase of complex trace from 0 to Nyquist + 121 = Wavenumber time domain (k-t) + 122 = Wavenumber frequency (k-omega) + 123 = Envelope of the complex time trace + 124 = Phase of the complex time trace + 125 = Frequency of the complex time trace + 130 = Depth-Range (z-x) traces + 201 = Seismic data packed to bytes (by supack1) + 202 = Seismic data packed to 2 bytes (by supack2) + byte# 29-30 + */ + + short nvs; /* Number of vertically summed traces yielding + this trace. (1 is one trace, + 2 is two summed traces, etc.) + byte# 31-32 + */ + + short nhs; /* Number of horizontally summed traces yielding + this trace. (1 is one trace + 2 is two summed traces, etc.) + byte# 33-34 + */ + + short duse; /* Data use: + 1 = Production + 2 = Test + byte# 35-36 + */ + + int offset; /* Distance from the center of the source point + to the center of the receiver group + (negative if opposite to direction in which + the line was shot). + byte# 37-40 + */ + + int gelev; /* Receiver group elevation from sea level + (all elevations above the Vertical datum are + positive and below are negative). + byte# 41-44 + */ + + int selev; /* Surface elevation at source. + byte# 45-48 + */ + + int sdepth; /* Source depth below surface (a positive number). + byte# 49-52 + */ + + int gdel; /* Datum elevation at receiver group. + byte# 53-56 + */ + + int sdel; /* Datum elevation at source. + byte# 57-60 + */ + + int swdep; /* Water depth at source. + byte# 61-64 + */ + + int gwdep; /* Water depth at receiver group. + byte# 65-68 + */ + + short scalel; /* Scalar to be applied to the previous 7 entries + to give the real value. + Scalar = 1, +10, +100, +1000, +10000. + If positive, scalar is used as a multiplier, + if negative, scalar is used as a divisor. + byte# 69-70 + */ + + short scalco; /* Scalar to be applied to the next 4 entries + to give the real value. + Scalar = 1, +10, +100, +1000, +10000. + If positive, scalar is used as a multiplier, + if negative, scalar is used as a divisor. + byte# 71-72 + */ + + int sx; /* Source coordinate - X + byte# 73-76 + */ + + int sy; /* Source coordinate - Y + byte# 77-80 + */ + + int gx; /* Group coordinate - X + byte# 81-84 + */ + + int gy; /* Group coordinate - Y + byte# 85-88 + */ + + short counit; /* Coordinate units: (for previous 4 entries and + for the 7 entries before scalel) + 1 = Length (meters or feet) + 2 = Seconds of arc + 3 = Decimal degrees + 4 = Degrees, minutes, seconds (DMS) + + In case 2, the X values are longitude and + the Y values are latitude, a positive value designates + the number of seconds east of Greenwich + or north of the equator + + In case 4, to encode +-DDDMMSS + counit = +-DDD*10^4 + MM*10^2 + SS, + with scalco = 1. To encode +-DDDMMSS.ss + counit = +-DDD*10^6 + MM*10^4 + SS*10^2 + with scalco = -100. + byte# 89-90 + */ + + short wevel; /* Weathering velocity. + byte# 91-92 + */ + + short swevel; /* Subweathering velocity. + byte# 93-94 + */ + + short sut; /* Uphole time at source in milliseconds. + byte# 95-96 + */ + + short gut; /* Uphole time at receiver group in milliseconds. + byte# 97-98 + */ + + short sstat; /* Source static correction in milliseconds. + byte# 99-100 + */ + + short gstat; /* Group static correction in milliseconds. + byte# 101-102 + */ + + short tstat; /* Total static applied in milliseconds. + (Zero if no static has been applied.) + byte# 103-104 + */ + + short laga; /* Lag time A, time in ms between end of 240- + byte trace identification header and time + break, positive if time break occurs after + end of header, time break is defined as + the initiation pulse which maybe recorded + on an auxiliary trace or as otherwise + specified by the recording system + byte# 105-106 + */ + + short lagb; /* lag time B, time in ms between the time break + and the initiation time of the energy source, + may be positive or negative + byte# 107-108 + */ + + short delrt; /* delay recording time, time in ms between + initiation time of energy source and time + when recording of data samples begins + (for deep water work if recording does not + start at zero time) + byte# 109-110 + */ + + short muts; /* mute time--start + byte# 111-112 + */ + + short mute; /* mute time--end + byte# 113-114 + */ + + unsigned short ns; /* number of samples in this trace + byte# 115-116 + */ + + unsigned short dt; /* sample interval; in micro-seconds + byte# 117-118 + */ + + short gain; /* gain type of field instruments code: + 1 = fixed + 2 = binary + 3 = floating point + 4 ---- N = optional use + byte# 119-120 + */ + + short igc; /* instrument gain constant + byte# 121-122 + */ + + short igi; /* instrument early or initial gain + byte# 123-124 + */ + + short corr; /* correlated: + 1 = no + 2 = yes + byte# 125-126 + */ + + short sfs; /* sweep frequency at start + byte# 127-128 + */ + + short sfe; /* sweep frequency at end + byte# 129-130 + */ + + short slen; /* sweep length in ms + byte# 131-132 + */ + + short styp; /* sweep type code: + 1 = linear + 2 = cos-squared + 3 = other + byte# 133-134 + */ + + short stas; /* sweep trace length at start in ms + byte# 135-136 + */ + + short stae; /* sweep trace length at end in ms + byte# 137-138 + */ + + short tatyp; /* taper type: 1=linear, 2=cos^2, 3=other + byte# 139-140 + */ + + short afilf; /* alias filter frequency if used + byte# 141-142 + */ + + short afils; /* alias filter slope + byte# 143-144 + */ + + short nofilf; /* notch filter frequency if used + byte# 145-146 + */ + + short nofils; /* notch filter slope + byte# 147-148 + */ + + short lcf; /* low cut frequency if used + byte# 149-150 + */ + + short hcf; /* high cut frequncy if used + byte# 151-152 + */ + + short lcs; /* low cut slope + byte# 153-154 + */ + + short hcs; /* high cut slope + byte# 155-156 + */ + + short year; /* year data recorded + byte# 157-158 + */ + + short day; /* day of year + byte# 159-160 + */ + + short hour; /* hour of day (24 hour clock) + byte# 161-162 + */ + + short minute; /* minute of hour + byte# 163-164 + */ + + short sec; /* second of minute + byte# 165-166 + */ + + short timbas; /* time basis code: + 1 = local + 2 = GMT + 3 = other + byte# 167-168 + */ + + short trwf; /* trace weighting factor, defined as 1/2^N + volts for the least sigificant bit + byte# 169-170 + */ + + short grnors; /* geophone group number of roll switch + position one + byte# 171-172 + */ + + short grnofr; /* geophone group number of trace one within + original field record + byte# 173-174 + */ + + short grnlof; /* geophone group number of last trace within + original field record + byte# 175-176 + */ + + short gaps; /* gap size (total number of groups dropped) + byte# 177-178 + */ + + short otrav; /* overtravel taper code: + 1 = down (or behind) + 2 = up (or ahead) + byte# 179-180 + */ + +#ifdef SLTSU_SEGY_H /* begin Unocal SU segy.h differences */ + + + /* cwp local assignments */ + float d1; /* sample spacing for non-seismic data + byte# 181-184 + */ + + float f1; /* first sample location for non-seismic data + byte# 185-188 + */ + + float d2; /* sample spacing between traces + byte# 189-192 + */ + + float f2; /* first trace location + byte# 193-196 + */ + + float ungpow; /* negative of power used for dynamic + range compression + byte# 197-200 + */ + + float unscale; /* reciprocal of scaling factor to normalize + range + byte# 201-204 + */ + + short mark; /* mark selected traces + byte# 205-206 + */ + + /* SLTSU local assignments */ + short mutb; /* mute time at bottom (start time) + bottom mute ends at last sample + byte# 207-208 + */ + float dz; /* depth sampling interval in (m or ft) + if =0.0, input are time samples + byte# 209-212 + */ + + float fz; /* depth of first sample in (m or ft) + byte# 213-116 + */ + + short n2; /* number of traces per cdp or per shot + byte# 217-218 + */ + + short shortpad; /* alignment padding + byte# 219-220 + */ + + int ntr; /* number of traces + byte# 221-224 + */ + + /* SLTSU local assignments end */ + + short unass[8]; /* unassigned + byte# 225-240 + */ + +#else + + /* cwp local assignments */ + float d1; /* sample spacing for non-seismic data + byte# 181-184 + */ + + float f1; /* first sample location for non-seismic data + byte# 185-188 + */ + + float d2; /* sample spacing between traces + byte# 189-192 + */ + + float f2; /* first trace location + byte# 193-196 + */ + + float ungpow; /* negative of power used for dynamic + range compression + byte# 197-200 + */ + + float unscale; /* reciprocal of scaling factor to normalize + range + byte# 201-204 + */ + + int ntr; /* number of traces + byte# 205-208 + */ + + short mark; /* mark selected traces + byte# 209-210 + */ + + short shortpad; /* alignment padding + byte# 211-212 + */ + + + short unass[14]; /* unassigned--NOTE: last entry causes + a break in the word alignment, if we REALLY + want to maintain 240 bytes, the following + entry should be an odd number of short/UINT2 + OR do the insertion above the "mark" keyword + entry + byte# 213-240 + */ +#endif + +} segy; + + +typedef struct { /* bhed - binary header */ + + int jobid; /* job identification number */ + + int lino; /* line number (only one line per reel) */ + + int reno; /* reel number */ + + short ntrpr; /* number of data traces per record */ + + short nart; /* number of auxiliary traces per record */ + + unsigned short hdt; /* sample interval in micro secs for this reel */ + + unsigned short dto; /* same for original field recording */ + + unsigned short hns; /* number of samples per trace for this reel */ + + unsigned short nso; /* same for original field recording */ + + short format; /* data sample format code: + 1 = floating point, 4 byte (32 bits) + 2 = fixed point, 4 byte (32 bits) + 3 = fixed point, 2 byte (16 bits) + 4 = fixed point w/gain code, 4 byte (32 bits) + 5 = IEEE floating point, 4 byte (32 bits) + 8 = two's complement integer, 1 byte (8 bits) + */ + + short fold; /* CDP fold expected per CDP ensemble */ + + short tsort; /* trace sorting code: + 1 = as recorded (no sorting) + 2 = CDP ensemble + 3 = single fold continuous profile + 4 = horizontally stacked */ + + short vscode; /* vertical sum code: + 1 = no sum + 2 = two sum ... + N = N sum (N = 32,767) */ + + short hsfs; /* sweep frequency at start */ + + short hsfe; /* sweep frequency at end */ + + short hslen; /* sweep length (ms) */ + + short hstyp; /* sweep type code: + 1 = linear + 2 = parabolic + 3 = exponential + 4 = other */ + + short schn; /* trace number of sweep channel */ + + short hstas; /* sweep trace taper length at start if + tapered (the taper starts at zero time + and is effective for this length) */ + + short hstae; /* sweep trace taper length at end (the ending + taper starts at sweep length minus the taper + length at end) */ + + short htatyp; /* sweep trace taper type code: + 1 = linear + 2 = cos-squared + 3 = other */ + + short hcorr; /* correlated data traces code: + 1 = no + 2 = yes */ + + short bgrcv; /* binary gain recovered code: + 1 = yes + 2 = no */ + + short rcvm; /* amplitude recovery method code: + 1 = none + 2 = spherical divergence + 3 = AGC + 4 = other */ + + short mfeet; /* measurement system code: + 1 = meters + 2 = feet */ + + short polyt; /* impulse signal polarity code: + 1 = increase in pressure or upward + geophone case movement gives + negative number on tape + 2 = increase in pressure or upward + geophone case movement gives + positive number on tape */ + + short vpol; /* vibratory polarity code: + code seismic signal lags pilot by + 1 337.5 to 22.5 degrees + 2 22.5 to 67.5 degrees + 3 67.5 to 112.5 degrees + 4 112.5 to 157.5 degrees + 5 157.5 to 202.5 degrees + 6 202.5 to 247.5 degrees + 7 247.5 to 292.5 degrees + 8 293.5 to 337.5 degrees */ + + short hunass[170]; /* unassigned */ + +} bhed; + +/* DEFINES */ +#define gettr(x) fgettr(stdin, (x)) +#define vgettr(x) fvgettr(stdin, (x)) +#define puttr(x) fputtr(stdout, (x)) +#define vputtr(x) fvputtr(stdout, (x)) +#define gettra(x, y) fgettra(stdin, (x), (y)) + + +/* TOTHER represents "other" */ +#define TOTHER -1 +/* TUNK represents time traces of an unknown type */ +#define TUNK 0 +/* TREAL represents real time traces */ +#define TREAL 1 +/* TDEAD represents dead time traces */ +#define TDEAD 2 +/* TDUMMY represents dummy time traces */ +#define TDUMMY 3 +/* TBREAK represents time break traces */ +#define TBREAK 4 +/* UPHOLE represents uphole traces */ +#define UPHOLE 5 +/* SWEEP represents sweep traces */ +#define SWEEP 6 +/* TIMING represents timing traces */ +#define TIMING 7 +/* WBREAK represents timing traces */ +#define WBREAK 8 +/* NFGUNSIG represents near field gun signature */ +#define NFGUNSIG 9 +/* FFGUNSIG represents far field gun signature */ +#define FFGUNSIG 10 +/* SPSENSOR represents seismic pressure sensor */ +#define SPSENSOR 11 +/* TVERT represents multicomponent seismic sensor + - vertical component */ +#define TVERT 12 +/* TXLIN represents multicomponent seismic sensor + - cross-line component */ +#define TXLIN 13 +/* TINLIN represents multicomponent seismic sensor + - in-line component */ +#define TINLIN 14 +/* ROTVERT represents rotated multicomponent seismic sensor + - vertical component */ +#define ROTVERT 15 +/* TTRANS represents rotated multicomponent seismic sensor + - transverse component */ +#define TTRANS 16 +/* TRADIAL represents rotated multicomponent seismic sensor + - radial component */ +#define TRADIAL 17 +/* VRMASS represents vibrator reaction mass */ +#define VRMASS 18 +/* VBASS represents vibrator baseplate */ +#define VBASS 19 +/* VEGF represents vibrator estimated ground force */ +#define VEGF 20 +/* VREF represents vibrator reference */ +#define VREF 21 + +/*** CWP trid assignments ***/ +/* ACOR represents autocorrelation */ +#define ACOR 109 +/* FCMPLX represents fourier transformed - no packing + xr[0],xi[0], ..., xr[N-1],xi[N-1] */ +#define FCMPLX 110 +/* FUNPACKNYQ represents fourier transformed - unpacked Nyquist + xr[0],xi[0],...,xr[N/2],xi[N/2] */ +#define FUNPACKNYQ 111 +/* FTPACK represents fourier transformed - packed Nyquist + even N: xr[0],xr[N/2],xr[1],xi[1], ..., + xr[N/2 -1],xi[N/2 -1] + (note the exceptional second entry) + odd N: + xr[0],xr[(N-1)/2],xr[1],xi[1], ..., + xr[(N-1)/2 -1],xi[(N-1)/2 -1],xi[(N-1)/2] + (note the exceptional second & last entries) +*/ +#define FTPACK 112 +/* TCMPLX represents complex time traces */ +#define TCMPLX 113 +/* FAMPH represents freq domain data in amplitude/phase form */ +#define FAMPH 114 +/* TAMPH represents time domain data in amplitude/phase form */ +#define TAMPH 115 +/* REALPART represents the real part of a trace to Nyquist */ +#define REALPART 116 +/* IMAGPART represents the real part of a trace to Nyquist */ +#define IMAGPART 117 +/* AMPLITUDE represents the amplitude of a trace to Nyquist */ +#define AMPLITUDE 118 +/* PHASE represents the phase of a trace to Nyquist */ +#define PHASE 119 +/* KT represents wavenumber-time domain data */ +#define KT 121 +/* KOMEGA represents wavenumber-frequency domain data */ +#define KOMEGA 122 +/* ENVELOPE represents the envelope of the complex time trace */ +#define ENVELOPE 123 +/* INSTPHASE represents the phase of the complex time trace */ +#define INSTPHASE 124 +/* INSTFREQ represents the frequency of the complex time trace */ +#define INSTFREQ 125 +/* DEPTH represents traces in depth-range (z-x) */ +#define TRID_DEPTH 130 +/* 3C data... v,h1,h2=(11,12,13)+32 so a bitmask will convert */ +/* between conventions */ +/* CHARPACK represents byte packed seismic data from supack1 */ +#define CHARPACK 201 +/* SHORTPACK represents 2 byte packed seismic data from supack2 */ +#define SHORTPACK 202 + + +#define ISSEISMIC(id) (( (id)==TUNK || (id)==TREAL || (id)==TDEAD || (id)==TDUMMY || (id)==TBREAK || (id)==UPHOLE || (id)==SWEEP || (id)==TIMING || (id)==WBREAK || (id)==NFGUNSIG || (id)==FFGUNSIG || (id)==SPSENSOR || (id)==TVERT || (id)==TXLIN || (id)==TINLIN || (id)==ROTVERT || (id)==TTRANS || (id)==TRADIAL || (id)==ACOR ) ? cwp_true : cwp_false ) + +/* FUNCTION PROTOTYPES */ +#ifdef __cplusplus /* if C++, specify external linkage to C functions */ +extern "C" { +#endif + +/* get trace and put trace */ +int fgettr(FILE *fp, segy *tp); +int fvgettr(FILE *fp, segy *tp); +void fputtr(FILE *fp, segy *tp); +void fvputtr(FILE *fp, segy *tp); +int fgettra(FILE *fp, segy *tp, int itr); + +/* get gather and put gather */ +segy **fget_gather(FILE *fp, cwp_String *key,cwp_String *type,Value *n_val, + int *nt,int *ntr, float *dt,int *first); +segy **get_gather(cwp_String *key, cwp_String *type, Value *n_val, + int *nt, int *ntr, float *dt, int *first); +segy **fput_gather(FILE *fp, segy **rec,int *nt, int *ntr); +segy **put_gather(segy **rec,int *nt, int *ntr); + +/* hdrpkge */ +void gethval(const segy *tp, int index, Value *valp); +void puthval(segy *tp, int index, Value *valp); +void getbhval(const bhed *bhp, int index, Value *valp); +void putbhval(bhed *bhp, int index, Value *valp); +void gethdval(const segy *tp, char *key, Value *valp); +void puthdval(segy *tp, char *key, Value *valp); +char *hdtype(const char *key); +char *getkey(const int index); +int getindex(const char *key); +void swaphval(segy *tp, int index); +void swapbhval(bhed *bhp, int index); +void printheader(const segy *tp); + +void tabplot(segy *tp, int itmin, int itmax); + +#ifdef __cplusplus /* if C++, end external linkage specification */ +} +#endif + +#endif diff --git a/MDD/verbosepkg.c b/MDD/verbosepkg.c new file mode 120000 index 0000000..248253e --- /dev/null +++ b/MDD/verbosepkg.c @@ -0,0 +1 @@ +../utils/verbosepkg.c \ No newline at end of file diff --git a/MDD/wallclock_time.c b/MDD/wallclock_time.c new file mode 120000 index 0000000..0bd00b4 --- /dev/null +++ b/MDD/wallclock_time.c @@ -0,0 +1 @@ +../utils/wallclock_time.c \ No newline at end of file diff --git a/MDD/writeEigen.c b/MDD/writeEigen.c new file mode 100644 index 0000000..e2ede69 --- /dev/null +++ b/MDD/writeEigen.c @@ -0,0 +1,55 @@ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include "segy.h" +#include <assert.h> + + +void writeEigen(char *file_out, float df, int nw_low, int nw_high, int nw, float *eigen, int nx, float dx, float xmin) +{ + static FILE *out_file; + float *trace, scl, re, im; + int sign, ntfft, i, j, ie, iw, count; + segy *hdrs_out; + size_t nwrite; + char filename[256], ext[32]; + + trace = (float *)malloc(nx*sizeof(float)); + hdrs_out = (segy *)calloc(TRCBYTES,1); + + hdrs_out[0].dt=df*1000000; + hdrs_out[0].trid = 1; + hdrs_out[0].ns = nx; + hdrs_out[0].d1 = 1; + hdrs_out[0].f1 = 1; + hdrs_out[0].f2 = nw_low*df; + hdrs_out[0].d2 = df; + hdrs_out[0].trwf = nw; + hdrs_out[0].fldr = 1; + + strcpy(filename, file_out); + sprintf(ext,"%s.su", "_eigen"); + strcpy(strstr(filename, ".su"), ext); + out_file = fopen(filename, "w+"); assert( out_file ); + fprintf(stderr,"writing eigenvalues of matrix to %s\n", filename); + count=1; + + for (iw=0; iw<nw; iw++) { + hdrs_out[0].tracl = iw+1; + for (i = 0; i < nx; i++) { + trace[i] = eigen[iw*nx+i]; + } + nwrite = fwrite(&hdrs_out[0], 1, TRCBYTES, out_file); + assert( nwrite == TRCBYTES ); + nwrite = fwrite(trace, sizeof(float), nx, out_file); + assert( nwrite == nx ); + } + fflush(out_file); + fclose(out_file); + + free(hdrs_out); + free(trace); + + return; +} + diff --git a/Makefile b/Makefile index b85040f..74e45de 100644 --- a/Makefile +++ b/Makefile @@ -7,6 +7,7 @@ all: mkdirs cd marchenko ; $(MAKE) install cd corrvir ; $(MAKE) install cd raytime ; $(MAKE) install + cd MDD ; $(MAKE) install mkdirs: -mkdir -p lib @@ -20,6 +21,7 @@ clean: cd marchenko ; $(MAKE) $@ cd corrvir ; $(MAKE) $@ cd raytime ; $(MAKE) $@ + cd MDD ; $(MAKE) $@ realclean: cd FFTlib ; $(MAKE) $@ @@ -28,6 +30,7 @@ realclean: cd marchenko ; $(MAKE) $@ cd corrvir ; $(MAKE) $@ cd raytime ; $(MAKE) $@ + cd MDD ; $(MAKE) $@ rm -f lib/* rm -f include/* rm -f bin/* diff --git a/utils/getFileInfo.c b/utils/getFileInfo.c index 490ba4a..61ff7ba 100644 --- a/utils/getFileInfo.c +++ b/utils/getFileInfo.c @@ -1,6 +1,3 @@ -#define _FILE_OFFSET_BITS 64 -#define _LARGEFILE_SOURCE - #include <assert.h> #include <stdio.h> #include <stdlib.h> diff --git a/utils/green3D b/utils/green3D deleted file mode 100755 index 3513a0edb3c0096f4a53c9e3fa73a5474de53bf5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 147424 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 Hf1>^X>?x{r -- GitLab