#define _FILE_OFFSET_BITS 64 #define _LARGEFILE_SOURCE #define _LARGEFILE64_SOURCE #include <stdio.h> #include <stdlib.h> #include <errno.h> #include <math.h> #include <string.h> #include "par.h" #include "segy.h" #include "fdacrtmc.h" /* * Writes recorded wavefields to disk. * * AUTHOR: * Max Holicki (m.e.holicki@tudelft.nl) * The Netherlands * ORIGINAL: * Jan Thorbecke (janth@xs4all.nl) * The Netherlands */ FILE *fileOpen(char *file, char *ext, int append); void writePRecording(FILE *fp, modPar *mod, srcPar *rcv, segy *hdr){ size_t i; for(i=0;i<rcv->nsrc;i++){ if(rcv->typ[i]==1){ //Check if Pressure Recording? /* Update Header */ ++hdr->tracl; ++hdr->tracf; hdr->gelev=(int)(-1000.*rcv->z[i]); hdr->gx=(int)(1000.*rcv->x[i]); /* Write to Disk */ fwrite(hdr,1,TRCBYTES,fp); fwrite(&(rcv->wav[i*mod->nt]),sizeof(float),mod->nt,fp); } } } void writeVxRecording(FILE *fp, modPar *mod, srcPar *rcv, segy *hdr){ size_t i; for(i=0;i<rcv->nsrc;i++){ if(rcv->typ[i]==6){ //Check if Horizontal Particle Velocity Recording? /* Update Header */ ++hdr->tracl; ++hdr->tracf; hdr->gelev=(int)(-1000.*rcv->z[i]); hdr->gx=(int)(1000.*rcv->x[i]); /* Write to Disk */ fwrite(hdr,1,TRCBYTES,fp); fwrite(&(rcv->wav[i*mod->nt]),sizeof(float),mod->nt,fp); } } } void writeVzRecording(FILE *fp, modPar *mod, srcPar *rcv, segy *hdr){ size_t i; for(i=0;i<rcv->nsrc;i++){ if(rcv->typ[i]==7){ //Check if Vertical Particle Velocity Recording? /* Update Header */ ++hdr->tracl; ++hdr->tracf; hdr->gelev=(int)(-1000.*rcv->z[i]); hdr->gx=(int)(1000.*rcv->x[i]); /* Write to Disk */ fwrite(hdr,1,TRCBYTES,fp); fwrite(&(rcv->wav[i*mod->nt]),sizeof(float),mod->nt,fp); } } } int writeRec(modPar *mod, srcPar *rcv, recPar *rec){ static int first=1; FILE *fp; segy hdr; int append; if(first){append=0;first=0;}else append=1; /***********************/ /* Create Trace Header */ /***********************/ memset(&hdr,0,TRCBYTES); hdr.fldr =mod->fldr; hdr.scalco=-1000; hdr.scalel=-1000; hdr.ns =(int)mod->nt; hdr.dt =(int)mod->dtus; /************************************/ /* Write Pressure Recording To Disk */ /************************************/ if(rec->p){ hdr.tracl =rcv->tracl; hdr.trid=1; hdr.tracf=0; fp=fileOpen(rcv->file_src,"_rp",append); writePRecording(fp,mod,rcv,&hdr); fclose(fp); } /*******************************************************/ /* Write Horizontal Particle Velocity Snapshot To Disk */ /*******************************************************/ if(rec->vx){ hdr.tracl =rcv->tracl; hdr.trid=6; hdr.tracf=0; fp=fileOpen(rcv->file_src,"_rvx",append); writeVxRecording(fp,mod,rcv,&hdr); fclose(fp); } /*****************************************************/ /* Write Vertical Particle Velocity Snapshot To Disk */ /*****************************************************/ if(rec->vz){ hdr.tracl =rcv->tracl; hdr.trid=7; hdr.tracf=0; fp=fileOpen(rcv->file_src,"_rvz",append); writeVzRecording(fp,mod,rcv,&hdr); fclose(fp); } rcv->tracl+=rcv->nsrc; return(0); }