diff --git a/fdelmodc/decomposition.c.new b/fdelmodc/decomposition.c.new deleted file mode 100644 index 3b03ba5a6c5956578ee28c89977bdde47c9d073f..0000000000000000000000000000000000000000 --- a/fdelmodc/decomposition.c.new +++ /dev/null @@ -1,247 +0,0 @@ -/* - * decomposition.c - * - * Kees Wapenaar "Reciprocity properties of one-way propagators" - * GEOPHYSICS, VOL. 63, NO. 4 (JULY-AUGUST 1998); P. 1795–1798 - * - * Created by Jan Thorbecke on 17/03/2014. - * Copyright 2014 TU Delft. All rights reserved. - * - */ - -#include <assert.h> -#include <stdio.h> -#include <stdlib.h> -#include <errno.h> -#include <math.h> -#include <string.h> - -#define MAX(x,y) ((x) > (y) ? (x) : (y)) -#define MIN(x,y) ((x) < (y) ? (x) : (y)) - -#ifndef COMPLEX -typedef struct _complexStruct { /* complex number */ - float r,i; -} complex; -typedef struct _dcomplexStruct { /* complex number */ - double r,i; -} dcomplex; -#endif/* complex */ - -complex firoot(float x, float stab) -complex ciroot(complex x, float stab); -complex cwp_csqrt(complex z); - -void decud(float om, float rho, float cp, float dx, int nkx, complex *pu); - -void kxwfilter(complex *data, float k, float dx, int nkx, - float alfa1, float alfa2, float perc); - -void kxwdecomp(complex *rp, complex *rvz, complex *up, complex *down, - int nkx, float dx, int nt, float dt, float fmin, float fmax, - float cp, float rho) -{ - int iom, iomin, iomax, ikx, nfreq; - float omin, omax, deltom, om, kp, df; - float alpha, eps; - complex *pu, w; - complex ax, az; - - df = 1.0/((float)nt*dt); - deltom = 2.*M_PI*df; - omin = 2.*M_PI*fmin; - omax = 2.*M_PI*fmax; - nfreq = nt/2+1; - eps = 0.01; - alpha = 0.1; - - iomin = (int)MIN((omin/deltom), (nfreq-1)); - iomin = MAX(iomin, 1); - iomax = MIN((int)(omax/deltom), (nfreq-1)); - - pu = (complex *)malloc(nkx*sizeof(complex)); - - for (iom = iomin; iom <= iomax; iom++) { - om = iom*deltom; - - decud(om, rho, cp, dx, nkx, alpha, eps, pu); - -/* - kxwfilter(dpux, kp, dx, nkx, alfa1, alfa2, perc); - kxwfilter(dpuz, kp, dx, nkx, alfa1, alfa2, perc); -*/ - - for (ikx = 0; ikx < nkx; ikx++) { - ax.r = 0.5*rp[iom*nkx+ikx].r; - ax.i = 0.5*rp[iom*nkx+ikx].i; - az.r = 0.5*(rvz[iom*nkx+ikx].r*pu[ikx].r - rvz[iom*nkx+ikx].i*pu[ikx].i); - az.i = 0.5*(rvz[iom*nkx+ikx].i*pu[ikx].r + rvz[iom*nkx+ikx].r*pu[ikx].i); - - down[iom*nkx+ikx].r = ax.r + az.r; - down[iom*nkx+ikx].i = ax.i + az.i; - up[iom*nkx+ikx].r = ax.r - az.r; - up[iom*nkx+ikx].i = ax.i - az.i; - } - - } - - free(pu); - - return; -} - -void decud(float om, float rho, float cp, float dx, int nkx, float alpha, float eps, complex *pu); -{ - int ikx, ikxmax1, ikxmax2, filterpoints, filterppos; - float mu, kp, kp2, ks, ks2, ksk; - float kx, kx2, kzp2, kzs2, dkx; - float kxfmax, kxnyq, kpos, kneg, alfa, kfilt, perc, band, *filter; - complex kzp, kzs, cste, ckp, ckp2, ckzp2; - -/* with complex frequency - wom.r=om; - wom.i=alpha; - - ckp.r = wom.r/cp; - ckp.i = wom.i/cp; - ckp2.r = ckp.r*ckp.r-ckp.i*ckp.i; - ckp2.i = 2.0*ckp.r*ckp.i; - stab = eps*eps*(ckp.r*ckp.r+ckp.i*ckp.i); -*/ - - - kp = om/cp; - kp2 = kp*kp; - dkx = 2.0*M_PI/(nkx*dx); - stab = eps*eps*kp*kp; - - /* make kw filter at maximum angle alfa */ - alfa = 90.0; - perc = 0.10; /* percentage of band to use for smooth filter */ - filter = (float *)malloc(nkx*sizeof(float)); - kpos = kp*sin(M_PI*alfa/180.0); - kneg = -kpos; - kxnyq = M_PI/dx; - if (kpos > kxnyq) kpos = kxnyq; - band = kpos; - filterpoints = (int)fabs((int)(perc*band/dkx)); - kfilt = fabs(dkx*filterpoints); - if (kpos+kfilt < kxnyq) { - kxfmax = kpos+kfilt; - filterppos = filterpoints; - } - else { - kxfmax = kxnyq; - filterppos = (int)(0.15*nkx/2); - } - ikxmax1 = (int) (kxfmax/dkx); - ikxmax2 = ikxmax1 - filterppos; - // fprintf(stderr,"ikxmax1=%d ikxmax2=%d nkp=%d nkx=%d\n", ikxmax1, ikxmax2, (int)(kp/dkx), nkx); - - for (ikx = 0; ikx < ikxmax2; ikx++) - filter[ikx]=1.0; - for (ikx = ikxmax2; ikx < ikxmax1; ikx++) - filter[ikx] =(cos(M_PI*(ikx-ikxmax2)/(ikxmax1-ikxmax2))+1)/2.0; - for (ikx = ikxmax1; ikx <= nkx/2; ikx++) - filter[ikx] = 0.0; - /* end of kxfilter */ - - for (ikx = 0; ikx <= (nkx/2); ikx++) { - kx = ikx*dkx; - kx2 = kx*kx; - kzp2 = kp2 - kx2; - kzp = firoot(kzp2); - -/* with complex frequency - kzp2.r = kp2.r - kx2; - kzp2.i = kp2.i; - kzp = ciroot(kzp2, stab); -*/ - if (kzp2 != 0) { - pu[ikx].r = filter[ikx]*om*rho*kzp.r; - pu[ikx].i = filter[ikx]*om*rho*kzp.i; -// pu[ikx].r = om*rho*kzp.r; -// pu[ikx].i = om*rho*kzp.i; - } - else { - pu[ikx].r = 0.0; - pu[ikx].i = 0.0; - } - } - -/* operators are symmetric in kx-w domain */ - for (ikx = (nkx/2+1); ikx < nkx; ikx++) { - pu[ikx] = pu[nkx-ikx]; - } - free(filter); - - return; -} - -/* compute 1/x */ -complex firoot(float x, float stab) -{ - complex z; - if (x > 0.0) { - z.r = 1.0/sqrt(x+stab); - z.i = 0.0; - } - else if (x == 0.0) { - z.r = 0.0; - z.i = 0.0; - } - else { - z.r = 0.0; - z.i = 1.0/sqrt(-x+stab); - } - return z; -} - -complex ciroot(complex x, float stab) -{ - complex z, kz, kzz; - float kd; - - if (x.r == 0.0) { - z.r = 0.0; - z.i = 0.0; - } - else { - kzz = cwp_csqrt(x); - kz.r = kzz.r; - kz.i = -abs(kzz.i); - kd = kz.r*kz.r+kz.i*kz.i+stab; - z.r = kz.r/kd; - z.i = -kz.i/kd; - } - return z; -} - -complex cwp_csqrt(complex z) -{ - complex c; - float x,y,w,r; - if (z.r==0.0 && z.i==0.0) { - c.r = c.i = 0.0; - return c; - } else { - x = fabs(z.r); - y = fabs(z.i); - if (x>=y) { - r = y/x; - w = sqrt(x)*sqrt(0.5*(1.0+sqrt(1.0+r*r))); - } else { - r = x/y; - w = sqrt(y)*sqrt(0.5*(r+sqrt(1.0+r*r))); - } - if (z.r>=0.0) { - c.r = w; - c.i = z.i/(2.0*w); - } else { - c.i = (z.i>=0.0) ? w : -w; - c.r = z.i/(2.0*c.i); - } - return c; - } -} - diff --git a/fdelmodc/writeSnapTimes.c.org b/fdelmodc/writeSnapTimes.c.org deleted file mode 100644 index 69120ea518a619ede9580aec09e0c92f8f42a26c..0000000000000000000000000000000000000000 --- a/fdelmodc/writeSnapTimes.c.org +++ /dev/null @@ -1,172 +0,0 @@ -#define _FILE_OFFSET_BITS 64 -#define _LARGEFILE_SOURCE -#define _LARGEFILE64_SOURCE - -#include <assert.h> -#include <stdio.h> -#include <stdlib.h> -#include <errno.h> -#include <math.h> -#include <string.h> -#include "par.h" -#include "segy.h" -#include "fdelmodc.h" - -/** -* Writes gridded wavefield(s) at a desired time to output file(s) -* -* AUTHOR: -* Jan Thorbecke (janth@xs4all.nl) -* The Netherlands -**/ - - -FILE *fileOpen(char *file, char *ext, int append); -int traceWrite(segy *hdr, float *data, int n, FILE *fp); - -#define MAX(x,y) ((x) > (y) ? (x) : (y)) -#define MIN(x,y) ((x) < (y) ? (x) : (y)) -#define NINT(x) ((int)((x)>0.0?(x)+0.5:(x)-0.5)) - -int writeSnapTimes(modPar mod, snaPar sna, int ixsrc, int izsrc, int itime, float *vx, float *vz, float *tzz, float *txx, float *txz, int verbose) -{ - FILE *fpvx, *fpvz, *fptxx, *fptzz, *fptxz, *fpp, *fppp, *fpss; - int append, isnap; - int n1, ibnd, ixs, izs, ize, i, j; - int ix, iz, ix2, iz2; - float *snap, sdx; - segy hdr; - - if (sna.nsnap==0) return 0; - - ibnd = mod.iorder/2-1; - n1 = mod.naz; - sdx = 1.0/mod.dx; - - /* check if this itime is a desired snapshot time */ - if ( (((itime-sna.delay) % sna.skipdt)==0) && - (itime >= sna.delay) && - (itime <= sna.delay+(sna.nsnap-1)*sna.skipdt) ) { - - isnap = NINT((itime-sna.delay)/sna.skipdt); - if (verbose) vmess("Writing snapshot(%d) at time=%.3f", isnap+1, itime*mod.dt); - - if (isnap) append=1; - else append=0; - - if (sna.type.vx) fpvx = fileOpen(sna.file_snap, "_svx", append); - if (sna.type.vz) fpvz = fileOpen(sna.file_snap, "_svz", append); - if (sna.type.p) fpp = fileOpen(sna.file_snap, "_sp", append); - if (sna.type.txx) fptxx = fileOpen(sna.file_snap, "_stxx", append); - if (sna.type.tzz) fptzz = fileOpen(sna.file_snap, "_stzz", append); - if (sna.type.txz) fptxz = fileOpen(sna.file_snap, "_stxz", append); - if (sna.type.pp) fppp = fileOpen(sna.file_snap, "_spp", append); - if (sna.type.ss) fpss = fileOpen(sna.file_snap, "_sss", append); - - memset(&hdr,0,TRCBYTES); - hdr.dt = 1000000*(mod.dt); - hdr.scalco = -1000; - hdr.scalel = -1000; - hdr.sx = 1000*(mod.x0+ixsrc*mod.dx); - hdr.sdepth = 1000*(mod.z0+izsrc*mod.dz); - hdr.fldr = isnap+1; - hdr.trid = 1; - hdr.ns = sna.nz; - hdr.trwf = sna.nx; - hdr.ntr = (isnap+1)*sna.nx; - hdr.f1 = sna.z1*mod.dz+mod.z0; - hdr.f2 = sna.x1*mod.dx+mod.x0; - hdr.d1 = mod.dz*sna.skipdz; - hdr.d2 = mod.dx*sna.skipdx; - -/*********************************************************************** -* vx velocities have one sample less in x-direction -* vz velocities have one sample less in z-direction -* txz stresses have one sample less in z-direction and x-direction -***********************************************************************/ - - snap = (float *)malloc(sna.nz*sizeof(float)); - - /* Decimate, with skipdx and skipdz, the number of gridpoints written to file - and write to file. */ - for (ixs=sna.x1, i=0; ixs<=sna.x2; ixs+=sna.skipdx, i++) { - hdr.tracf = i+1; - hdr.tracl = isnap*sna.nx+i+1; - hdr.gx = 1000*(mod.x0+ixs*mod.dx); - ix = ixs+ibnd; - ix2 = ix+1; - - izs = sna.z1+ibnd; - ize = sna.z2+ibnd; - if (sna.type.vx) { - for (iz=izs, j=0; iz<=ize; iz+=sna.skipdz, j++) { - snap[j] = vx[ix2*n1+iz]; - } - traceWrite(&hdr, snap, sna.nz, fpvx); - } - if (sna.type.vz) { - for (iz=izs, j=0; iz<=ize; iz+=sna.skipdz, j++) { - snap[j] = vz[ix*n1+iz+1]; - } - traceWrite(&hdr, snap, sna.nz, fpvz); - } - if (sna.type.p) { - for (iz=izs, j=0; iz<=ize; iz+=sna.skipdz, j++) { - snap[j] = tzz[ix*n1+iz]; - } - traceWrite(&hdr, snap, sna.nz, fpp); - } - if (sna.type.tzz) { - for (iz=izs, j=0; iz<=ize; iz+=sna.skipdz, j++) { - snap[j] = tzz[ix*n1+iz]; - } - traceWrite(&hdr, snap, sna.nz, fptzz); - } - if (sna.type.txx) { - for (iz=izs, j=0; iz<=ize; iz+=sna.skipdz, j++) { - snap[j] = txx[ix*n1+iz]; - } - traceWrite(&hdr, snap, sna.nz, fptxx); - } - if (sna.type.txz) { - for (iz=izs, j=0; iz<=ize; iz+=sna.skipdz, j++) { - snap[j] = txz[ix2*n1+iz+1]; - } - traceWrite(&hdr, snap, sna.nz, fptxz); - } - /* calculate divergence of velocity field */ - if (sna.type.pp) { - for (iz=izs, j=0; iz<=ize; iz+=sna.skipdz, j++) { - iz2 = iz+1; - snap[j] = sdx*((vx[ix2*n1+iz]-vx[ix*n1+iz])+ - (vz[ix*n1+iz2]-vz[ix*n1+iz])); - } - traceWrite(&hdr, snap, sna.nz, fppp); - } - /* calculate rotation of velocity field */ - if (sna.type.ss) { - for (iz=izs, j=0; iz<=ize; iz+=sna.skipdz, j++) { - iz2 = iz+1; - snap[j] = sdx*((vx[ix2*n1+iz2]-vx[ix2*n1+iz])- - (vz[ix2*n1+iz2]-vz[ix*n1+iz2])); - } - traceWrite(&hdr, snap, sna.nz, fpss); - } - - } - - if (sna.type.vx) fclose(fpvx); - if (sna.type.vz) fclose(fpvz); - if (sna.type.p) fclose(fpp); - if (sna.type.txx) fclose(fptxx); - if (sna.type.tzz) fclose(fptzz); - if (sna.type.txz) fclose(fptxz); - if (sna.type.pp) fclose(fppp); - if (sna.type.ss) fclose(fpss); - - free(snap); - } - - return 0; -} -