Skip to content
Snippets Groups Projects
dataFileIO.c.new 5.65 KiB
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <assert.h>
#include <time.h>
#include <math.h>
#include <sys/time.h>
#include <sys/types.h>
#include "par.h"
#include "segyhdr.h"
#include "Area.h"

void cr1fft(complex *cdata, float *rdata, int n, int sign);
void rc1fft(float *rdata, complex *cdata, int n, int sign);

static int binary_file;

int read_FFT_DataFile(FILE *fp, complex *data, Area vel_area, int nfft, int nw, int nw_low, int *tr_read_in, int *tr_shot, int *ixmin, int *ixmax, int *iymin, int *iymax, int *sx, int *sy, int conjg, int verbose)
{
	int ix, iy, iw, i, nt, nx, ny, sxy, nfreq, pos, sign;
	float xvmin, yvmin;
	int err=0;
	int one_shot, traces_shot, fldr_s, traces_read_in;
	size_t  nread;
	float dx, dy, *trace, scl;
	complex *ctrace;
	segyhdr *hdr;

	nx  = vel_area.nx;
	ny  = vel_area.ny;
	sxy = vel_area.sxy;
	dx  = vel_area.dx;
	dy  = vel_area.dy;
	xvmin = vel_area.xmin;
	yvmin = vel_area.ymin;

	sign   = -1;
	nfreq  = nfft/2 + 1;
	hdr    = (segyhdr *)malloc(TRCBYTES);
    trace  =   (float *)calloc(nfft,sizeof(float));
    ctrace = (complex *)malloc(nfreq*sizeof(complex));

	one_shot=1;
	traces_shot = 0;
	traces_read_in = *tr_read_in;
	while (one_shot) {
		nread = fread( hdr, 1, TRCBYTES, fp );
		if (nread==0) {
			err = -1;
			break;
		}
		nt = hdr[0].ns;
		if (traces_shot==0) fldr_s = hdr[0].fldr;
		if ((fldr_s != hdr[0].fldr)) {
			fseek(fp, -TRCBYTES, SEEK_CUR);
			break;
		}

		if (traces_shot==0) {
			if (hdr[0].scalco < 0) scl = 1.0/fabs(hdr[0].scalco);
			else if (hdr[0].scalco == 0) scl = 1.0;
			else scl = hdr[0].scalco;
			*sx = hdr[0].sx;
			*sy = hdr[0].sy;
		}

		nread = fread( trace, sizeof(float), nt, fp );
		assert (nread == nt);
		traces_shot++;
		traces_read_in++;
	
		if (nfft > nt) memset( &trace[nt], 0, sizeof(float)*(nfft-nt) ); 
		rc1fft(trace,ctrace,nfft,sign);

		ix = (hdr[0].gx*scl-xvmin)/dx;
		iy = (hdr[0].gy*scl-yvmin)/dy;
		if (ix >=0 && ix<nx && iy>=0 && iy<ny) {
			for (iw=0; iw<nw; iw++) {
				data[iw*sxy+iy*nx+ix].r = ctrace[nw_low+iw].r;
				data[iw*sxy+iy*nx+ix].i = conjg*ctrace[nw_low+iw].i;
			}
			*ixmin = MIN(ix,*ixmin);
			*iymin = MIN(iy,*iymin);
			*ixmax = MAX(ix,*ixmax);
			*iymax = MAX(iy,*iymax);
		}
		else {
			fprintf(stderr,"*** trace at %.2f (%d), %.2f (%d) outside model\n",
				hdr[0].gx*scl, ix, hdr[0].gy*scl, iy);
		}

		if (verbose>2) {
			fprintf(stderr," trace %d: gx = %.2f(%d) gy = %.2f(%d) \n", 
				traces_shot, hdr[0].gx*scl, ix, hdr[0].gy*scl, iy);
		}

	} /* end of receiver gather */
	*tr_read_in = traces_read_in;
	*tr_shot    = traces_shot;

	free(hdr);
	free(trace);
	free(ctrace);

	return err;
}


int write_FFT_DataFile(FILE *fp, complex *data, Area data_area, int fldr, int nt, int nfft, int nw, int nw_low, float dt, int out_su, int conjg, int verbose)
{
	int ix, iy, iw, i, nx, ny, sxy, nfreq, pos, sign;
	int xvmin, yvmin;
	size_t  nwrite;
	float dx, dy, *trace;
	complex *ctrace;
	segyhdr *hdr;

	nx  = data_area.nx;
	ny  = data_area.ny;
	sxy = data_area.sxy;
	dx  = data_area.dx;
	dy  = data_area.dy;
	xvmin = data_area.xmin;
	yvmin = data_area.ymin;
	nfreq = nfft/2 + 1;
    sign  = 1;

    trace  =   (float *)calloc(nfft,sizeof(float));
    ctrace = (complex *)malloc(nfreq*sizeof(complex));
	hdr    = (segyhdr *)calloc(1,TRCBYTES);

	hdr[0].trid = 1;
	hdr[0].fldr = fldr;
	hdr[0].trwf = nx;
	hdr[0].ntr = nx*ny;
	hdr[0].ns = nt;
	hdr[0].dt = 1000000*dt;
	hdr[0].f1 = 0.0;
	hdr[0].f2 = xvmin;
	hdr[0].d1 = dt;
	hdr[0].d2 = dx;
    hdr[0].scalco = -1000;

    for (iy=0; iy<ny; iy++) {
        for (ix=0; ix<nx; ix++) {
			pos = iy*nx+ix;
			for (i=0; i<nfreq; i++) 
				ctrace[i].r = ctrace[i].i = 0.0;
			for (iw=0; iw<nw; iw++) {
				ctrace[iw+nw_low].r = data[iw*sxy+pos].r;
				ctrace[iw+nw_low].i = conjg*data[iw*sxy+pos].i;
			}

            /* transform back to time */
            cr1fft(ctrace, trace, nfft, sign);

            /* write to output file */
             if (out_su) {
                hdr[0].gx = (int)(xvmin+ix*dx)*1000;
                hdr[0].gy = (int)(yvmin+iy*dy)*1000;
		        hdr[0].f2 = xvmin+ix*dx;
		        hdr[0].tracf = ix+1;
		        hdr[0].tracl = iy*nx+ix+1;
		        nwrite = fwrite(hdr, 1, TRCBYTES, fp);
		        assert( nwrite == TRCBYTES );
		        nwrite = fwrite(trace, sizeof(float), nt, fp);
		        assert( nwrite == nt );
            }
            else {
	            nwrite = fwrite(trace, sizeof(float), nt, fp);
	            assert( nwrite == nt );
            }
        }
    }
	fflush(fp);

	free(trace);
	free(ctrace);
	free(hdr);

	return 0;
}


int write_ImageFile(FILE *fp, float *data, Area data_area, int fldr, int d, int out_su, int verbose)
{
	size_t nwrite;
	int ix, iy, j, ny, nx, nz, nxy;
	int xvmin, yvmin;
	float dx, dy, dz;
	segyhdr *hdr;

	nx  = data_area.nx;
	ny  = data_area.ny;
	nz  = data_area.nz;
	nxy = data_area.sxy;
	dx  = data_area.dx;
	dy  = data_area.dy;
	dz  = data_area.dz;
	xvmin = data_area.xmin;
	yvmin = data_area.ymin;

	/* write image file per depth slice */

	hdr    = (segyhdr *)calloc(1,TRCBYTES);
	hdr[0].ns = nx;
	hdr[0].dt = dz;
	hdr[0].trwf = ny; 
	hdr[0].ntr = ny*nz;
	hdr[0].f1 = xvmin; 
	hdr[0].f2 = yvmin;
	hdr[0].d1 = dx;
	hdr[0].d2 = dy;
	hdr[0].gx =(int)xvmin;
    hdr[0].scalco = -1000;
	hdr[0].trid = 30;
	hdr[0].fldr = fldr;
	hdr[0].sdepth = data_area.zmin+d*dz;

	if (out_su) {
		for (iy=0; iy<ny; iy++) {
			hdr[0].gy = (int)(yvmin+iy*dy)*1000;
			hdr[0].f2 = yvmin+iy*dy;
			hdr[0].tracf = iy+1;
			nwrite = fwrite(hdr, 1, TRCBYTES, fp);
			assert( nwrite == TRCBYTES );
			nwrite = fwrite(&data[iy*nx], sizeof(float), nx, fp);
			assert( nwrite == nx );
		}
	}
	else {
		nwrite = fwrite(data, sizeof(float), nxy, fp);
		assert( nwrite == nxy );
	}
	fflush(fp);

	free(hdr);

	return;

}