-
joeri.brackenhoff authoredjoeri.brackenhoff authored
writesufile3D.c 3.47 KiB
#include <stdlib.h>
#include <stdio.h>
#include <assert.h>
#include <string.h>
#include "par.h"
#include "fdelmodc3D.h"
#include "SUsegy.h"
#include "segy.h"
/**
* Writes an 2D array to a SU file
*
* AUTHOR:
* Jan Thorbecke (janth@xs4all.nl)
* The Netherlands
**/
#define TRCBYTES 240
#define MAX(x,y) ((x) > (y) ? (x) : (y))
#define MIN(x,y) ((x) < (y) ? (x) : (y))
#define ISODD(n) ((n) & 01)
#define NINT(x) ((long)((x)>0.0?(x)+0.5:(x)-0.5))
long writesufile3D(char *filename, float *data, long n1, long n2, float f1, float f2, float d1, float d2)
{
FILE *file_out;
size_t nwrite, itrace;
long ns;
segy *hdr;
/* Read in parameters */
if (n1 > USHRT_MAX) {
vwarn("Output file %s: number of samples is truncated from %li to USHRT_MAX.", filename, n1);
}
ns = MIN(n1,USHRT_MAX);
file_out = fopen( filename, "w+" );
assert( file_out );
hdr = (segy *)calloc(1,TRCBYTES);
hdr->ns = ns;
hdr->dt = NINT(1000000*(d1));
hdr->d1 = d1;
hdr->d2 = d2;
hdr->f1 = f1;
hdr->f2 = f2;
hdr->fldr = 1;
hdr->trwf = n2;
for (itrace=0; itrace<n2; itrace++) {
hdr->tracl = itrace+1;
nwrite = fwrite( hdr, 1, TRCBYTES, file_out );
assert (nwrite == TRCBYTES);
nwrite = fwrite( &data[itrace*n1], sizeof(float), ns, file_out );
assert (nwrite == ns);
}
fclose(file_out);
free(hdr);
return 0;
}
/**
* Writes an 2D array to a SU file
* special routine for src_nwav array which has a different number of samples for each shot
*
**/
long writesufilesrcnwav3D(char *filename, float **src_nwav, wavPar wav, long n1, long n2, float f1, float f2, float d1, float d2)
{
FILE *file_out;
size_t nwrite, itrace;
float *trace;
long ns;
segy *hdr;
/* Read in parameters */
if (n1 > USHRT_MAX) {
vwarn("Output file %s: number of samples is truncated from %li to USHRT_MAX.", filename, n1);
}
ns = MIN(n1,USHRT_MAX);
file_out = fopen( filename, "w+" );
assert( file_out );
trace = (float *)malloc(n1*sizeof(float));
hdr = (segy *)calloc(1,TRCBYTES);
hdr->ns = ns;
hdr->dt = NINT(1000000*(d1));
hdr->d1 = d1;
hdr->d2 = d2;
hdr->f1 = f1;
hdr->f2 = f2;
hdr->fldr = 1;
hdr->trwf = n2;
for (itrace=0; itrace<n2; itrace++) {
hdr->tracl = itrace+1;
nwrite = fwrite( hdr, 1, TRCBYTES, file_out );
assert (nwrite == TRCBYTES);
memset(trace, 0, n1*sizeof(float));
memcpy(trace, &src_nwav[itrace][0], wav.nsamp[itrace]*sizeof(float));
nwrite = fwrite( &trace[0], sizeof(float), ns, file_out );
assert (nwrite == ns);
}
fclose(file_out);
free(hdr);
free(trace);
return 0;
}
/**
* Writes an 2D array to a SU file
* special routine which used segyhdrs which have ns defined as integer (32 bit)
* to handle more than 2^16 samples per trace.
*
**/
long writeSUfile3D(char *filename, float *data, long n1, long n2, float f1, float f2, float d1, float d2)
{
FILE *file_out;
size_t nwrite, itrace;
SUsegy *SUhdr;
char *ptr;
/* Read in parameters */
ptr = strstr(filename, " ");
*ptr = '\0';
file_out = fopen( filename, "w+" );
assert( file_out );
SUhdr = (SUsegy *)calloc(1,TRCBYTES);
SUhdr->ns = n1;
SUhdr->dt = NINT(1000000*(d1));
SUhdr->d1 = d1;
SUhdr->d2 = d2;
SUhdr->f1 = f1;
SUhdr->f2 = f2;
SUhdr->fldr = 1;
SUhdr->trwf = n2;
for (itrace=0; itrace<n2; itrace++) {
SUhdr->tracl = itrace+1;
nwrite = fwrite( SUhdr, 1, TRCBYTES, file_out );
assert (nwrite == TRCBYTES);
nwrite = fwrite( &data[itrace*n1], sizeof(float), n1, file_out );
assert (nwrite == n1);
}
fclose(file_out);
free(SUhdr);
return 0;
}