-
Jan Willem Thorbecke authoredJan Willem Thorbecke authored
writeSnapshots.c 11.72 KiB
#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 gridded wavefield(s) at desired times to output file(s)
*
* 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);
//int MigDirDecompAcoustic4(modPar *mod, decompPar *decomp, wavPar *wav, fftPlansPar *fftPlans);
void writePSnapshot(FILE *fp,modPar *mod, snaPar *sna, segy *hdr, float *p){
size_t ix, iz;
fwrite(hdr,1,TRCBYTES,fp);
for(iz=0;iz<sna->nz;iz++)fwrite(&p[sna->x1*mod->naz+sna->z1+iz*sna->dzskip],sizeof(float),1,fp);
for(ix=1;ix<sna->nx;ix++){
/* Update Header */
++hdr->tracl;
++hdr->tracf;
hdr->gx=(int)(1000*(sna->xsnap1+ix*sna->dx));
/* Write to Disk */
fwrite(hdr,1,TRCBYTES,fp);
for(iz=0;iz<sna->nz;iz++)fwrite(&p[(sna->x1+ix*sna->dxskip)*mod->naz+sna->z1+iz*sna->dzskip],sizeof(float),1,fp);
}
}
void writeVxSnapshot(FILE *fp,modPar *mod, snaPar *sna, segy *hdr, float *vx){
size_t ix, iz;
fwrite(hdr,1,TRCBYTES,fp);
for(iz=0;iz<sna->nz;iz++)fwrite(&vx[(sna->x1+sna->vxshift)*mod->naz+sna->z1+iz*sna->dzskip],sizeof(float),1,fp);
for(ix=1;ix<sna->nx;ix++){
/* Update Header */
++hdr->tracl;
++hdr->tracf;
hdr->gx=(int)(1000*(sna->xsnap1+ix*sna->dx));
/* Write to Disk */
fwrite(hdr,1,TRCBYTES,fp);
for(iz=0;iz<sna->nz;iz++)fwrite(&vx[(sna->x1+ix*sna->dxskip+sna->vxshift)*mod->naz+sna->z1+iz*sna->dzskip],sizeof(float),1,fp);
}
}
void writeVzSnapshot(FILE *fp,modPar *mod, snaPar *sna, segy *hdr, float *vz){
size_t ix, iz;
fwrite(hdr,1,TRCBYTES,fp);
for(iz=0;iz<sna->nz;iz++)fwrite(&vz[sna->x1*mod->naz+sna->z1+iz*sna->dzskip+sna->vzshift],sizeof(float),1,fp);
for(ix=1;ix<sna->nx;ix++){
/* Update Header */
++hdr->tracl;
++hdr->tracf;
hdr->gx=(int)(1000*(sna->xsnap1+ix*sna->dx));
/* Write to Disk */
fwrite(hdr,1,TRCBYTES,fp);
for(iz=0;iz<sna->nz;iz++)fwrite(&vz[(sna->x1+ix*sna->dxskip)*mod->naz+sna->z1+iz*sna->dzskip+sna->vzshift],sizeof(float),1,fp);
}
}
int writeForwSnapshots(modPar *mod, snaPar *sna, wavPar *forw, decompPar *decomp, fftPlansPar *fftPlans){
static int first=1;
FILE *fp;
segy hdr;
int append;
if(first){append=0;first=0;}else append=1;
sna->ntr+=sna->nx;
/***********************/
/* Create Trace Header */
/***********************/
memset(&hdr,0,TRCBYTES);
// hdr.fldr =(int)++sna->isnap;
hdr.fldr =mod->fldr;
hdr.cdpt =(int)++sna->isnap; //Snapshot Number Corresponds to Ensemble Number
hdr.scalco=-1000;
hdr.scalel=-1000;
hdr.ns =(int)sna->nz;
hdr.dt =(int)(1000000*(sna->dt)+0.5);
hdr.trwf =(int)sna->nx;
hdr.ntr =(int)sna->ntr;
hdr.f1 =sna->zsnap1;
hdr.d1 =sna->dz;
hdr.f2 =sna->xsnap1;
hdr.d2 =sna->dx;
/***********************************/
/* Write Pressure Snapshot To Disk */
/***********************************/
if(sna->type.p&&mod->ischeme<3){ // Acoustic Pressure
hdr.tracl=sna->tracl; // Trace line number
hdr.trid=1; // Pressure
hdr.tracf=1; // Trace in field record
hdr.gx=(int)(1000*sna->xsnap1); //First trace coordinate
fp=fileOpen(sna->file_snap,"_sfp",append);
writePSnapshot(fp,mod,sna,&hdr,forw->tzz);
fclose(fp);
}
/*******************************************************/
/* Write Horizontal Particle Velocity Snapshot To Disk */
/*******************************************************/
if(sna->type.vx){ //Horizontal Particle Velocity
hdr.tracl=sna->tracl; // Trace line number
hdr.trid=6; // Horizontal Particle Velocity
hdr.tracf=1; // Trace in field record
hdr.gx=(int)(1000*sna->xsnap1); //First trace coordinate
fp=fileOpen(sna->file_snap,"_sfvx",append);
writeVxSnapshot(fp,mod,sna,&hdr,forw->vx);
fclose(fp);
}
/*****************************************************/
/* Write Vertical Particle Velocity Snapshot To Disk */
/*****************************************************/
if(sna->type.vz){ //Vertical Particle Velocity
hdr.tracl=sna->tracl; // Trace line number
hdr.trid=6; // Vertical Particle Velocity
hdr.tracf=1; // Trace in field record
hdr.gx=(int)(1000*sna->xsnap1); //First trace coordinate
fp=fileOpen(sna->file_snap,"_sfvz",append);
writeVzSnapshot(fp,mod,sna,&hdr,forw->vz);
fclose(fp);
}
/************************/
/* Decompose Wavefields */
/************************/
if(sna->decomp){};
if(0){ //TODO: Remove & Integrate into above
// MigDirDecompAcoustic4(mod,decomp,forw,fftPlans);
/***********************************/
/* Write Up-Going Pressure To Disk */
/***********************************/
if(sna->type.pu&&mod->ischeme<3){ // Acoustic Pressure
hdr.tracl=sna->tracl; // Trace line number
hdr.trid=101; // Up-Going Pressure
hdr.tracf=1; // Trace in field record
hdr.gx=(int)(1000*sna->xsnap1); //First trace coordinate
fp=fileOpen(sna->file_snap,"_sfpu",append);
writePSnapshot(fp,mod,sna,&hdr,forw->pu);
fclose(fp);
}
/*************************************/
/* Write Down-Going Pressure To Disk */
/*************************************/
if(sna->type.pd&&mod->ischeme<3){ // Acoustic Pressure
hdr.tracl=sna->tracl; // Trace line number
hdr.trid=102; // Down-Going Pressure
hdr.tracf=1; // Trace in field record
hdr.gx=(int)(1000*sna->xsnap1); //First trace coordinate
fp=fileOpen(sna->file_snap,"_sfpd",append);
writePSnapshot(fp,mod,sna,&hdr,forw->pd);
fclose(fp);
}
/*************************************/
/* Write Left-Going Pressure To Disk */
/*************************************/
if(sna->type.pl&&mod->ischeme<3){ // Acoustic Pressure
hdr.tracl=sna->tracl; // Trace line number
hdr.trid=103; // Up-Going Pressure
hdr.tracf=1; // Trace in field record
hdr.gx=(int)(1000*sna->xsnap1); //First trace coordinate
fp=fileOpen(sna->file_snap,"_sfpl",append);
writePSnapshot(fp,mod,sna,&hdr,forw->pl);
fclose(fp);
}
/**************************************/
/* Write Right-Going Pressure To Disk */
/**************************************/
if(sna->type.pr&&mod->ischeme<3){ // Acoustic Pressure
hdr.tracl=sna->tracl; // Trace line number
hdr.trid=104; // Up-Going Pressure
hdr.tracf=1; // Trace in field record
hdr.gx=(int)(1000*sna->xsnap1); //First trace coordinate
fp=fileOpen(sna->file_snap,"_sfpr",append);
writePSnapshot(fp,mod,sna,&hdr,forw->pr);
fclose(fp);
}
/***************************************/
/* Write Normal-Going Pressure To Disk */
/***************************************/
if(sna->type.pn&&mod->ischeme<3){ // Acoustic Pressure
hdr.tracl=sna->tracl; // Trace line number
hdr.trid=105; // Up-Going Pressure
hdr.tracf=1; // Trace in field record
hdr.gx=(int)(1000*sna->xsnap1); //First trace coordinate
fp=fileOpen(sna->file_snap,"_sfpn",append);
writePSnapshot(fp,mod,sna,&hdr,forw->pn);
fclose(fp);
}
}
sna->tracl+=sna->nx;
return(0);
}
int writeBackSnapshots(modPar *mod, snaPar *sna, wavPar *back, decompPar *decomp, fftPlansPar *fftPlans){
static int first=1;
FILE *fp;
segy hdr;
int append;
if(first){append=0;first=0;}else append=1;
sna->ntr+=sna->nx;
/***********************/
/* Create Trace Header */
/***********************/
memset(&hdr,0,TRCBYTES);
hdr.fldr =(int)++sna->isnap;
hdr.scalco=-1000;
hdr.scalel=-1000;
hdr.ns =(int)sna->nz;
hdr.dt =(int)(1000000*(sna->dt)+0.5);
hdr.trwf =(int)sna->nx;
hdr.ntr =(int)sna->ntr;
hdr.f1 =sna->zsnap1;
hdr.d1 =sna->dz;
hdr.f2 =sna->xsnap1;
hdr.d2 =sna->dx;
/***********************************/
/* Write Pressure Snapshot To Disk */
/***********************************/
if(sna->type.p&&mod->ischeme<3){ // Acoustic Pressure
hdr.tracl=sna->tracl; // Trace line number
hdr.trid=1; // Pressure
hdr.tracf=1; // Trace in field record
hdr.gx=(int)(1000*sna->xsnap1); //First trace coordinate
fp=fileOpen(sna->file_snap,"_sbp",append);
writePSnapshot(fp,mod,sna,&hdr,back->tzz);
fclose(fp);
}
/*******************************************************/
/* Write Horizontal Particle Velocity Snapshot To Disk */
/*******************************************************/
if(sna->type.vx){ //Horizontal Particle Velocity
hdr.tracl=sna->tracl; // Trace line number
hdr.trid=6; // Horizontal Particle Velocity
hdr.tracf=1; // Trace in field record
hdr.gx=(int)(1000*sna->xsnap1); //First trace coordinate
fp=fileOpen(sna->file_snap,"_sbvx",append);
writeVxSnapshot(fp,mod,sna,&hdr,back->vx);
fclose(fp);
}
/*****************************************************/
/* Write Vertical Particle Velocity Snapshot To Disk */
/*****************************************************/
if(sna->type.vx){ //Horizontal Particle Velocity
hdr.tracl=sna->tracl; // Trace line number
hdr.trid=6; // Horizontal Particle Velocity
hdr.tracf=1; // Trace in field record
hdr.gx=(int)(1000*sna->xsnap1); //First trace coordinate
fp=fileOpen(sna->file_snap,"_sbvz",append);
writeVzSnapshot(fp,mod,sna,&hdr,back->vz);
fclose(fp);
}
/************************/
/* Decompose Wavefields */
/************************/
if(sna->decomp){};
if(0){ //TODO: Remove & Integrate into above
// MigDirDecompAcoustic4(mod,decomp,back,fftPlans);
/***********************************/
/* Write Up-Going Pressure To Disk */
/***********************************/
if(sna->type.pu&&mod->ischeme<3){ // Acoustic Pressure
hdr.tracl=sna->tracl; // Trace line number
hdr.trid=101; // Up-Going Pressure
hdr.tracf=1; // Trace in field record
hdr.gx=(int)(1000*sna->xsnap1); //First trace coordinate
fp=fileOpen(sna->file_snap,"_sbpu",append);
writePSnapshot(fp,mod,sna,&hdr,back->pu);
fclose(fp);
}
/*************************************/
/* Write Down-Going Pressure To Disk */
/*************************************/
if(sna->type.pd&&mod->ischeme<3){ // Acoustic Pressure
hdr.tracl=sna->tracl; // Trace line number
hdr.trid=102; // Down-Going Pressure
hdr.tracf=1; // Trace in field record
hdr.gx=(int)(1000*sna->xsnap1); //First trace coordinate
fp=fileOpen(sna->file_snap,"_sbpd",append);
writePSnapshot(fp,mod,sna,&hdr,back->pd);
fclose(fp);
}
/*************************************/
/* Write Left-Going Pressure To Disk */
/*************************************/
if(sna->type.pl&&mod->ischeme<3){ // Acoustic Pressure
hdr.tracl=sna->tracl; // Trace line number
hdr.trid=103; // Up-Going Pressure
hdr.tracf=1; // Trace in field record
hdr.gx=(int)(1000*sna->xsnap1); //First trace coordinate
fp=fileOpen(sna->file_snap,"_sbpl",append);
writePSnapshot(fp,mod,sna,&hdr,back->pl);
fclose(fp);
}
/**************************************/
/* Write Right-Going Pressure To Disk */
/**************************************/
if(sna->type.pr&&mod->ischeme<3){ // Acoustic Pressure
hdr.tracl=sna->tracl; // Trace line number
hdr.trid=104; // Up-Going Pressure
hdr.tracf=1; // Trace in field record
hdr.gx=(int)(1000*sna->xsnap1); //First trace coordinate
fp=fileOpen(sna->file_snap,"_sbpr",append);
writePSnapshot(fp,mod,sna,&hdr,back->pr);
fclose(fp);
}
/**************************************/
/* Write Right-Going Pressure To Disk */
/**************************************/
if(sna->type.pn&&mod->ischeme<3){ // Acoustic Pressure
hdr.tracl=sna->tracl; // Trace line number
hdr.trid=105; // Up-Going Pressure
hdr.tracf=1; // Trace in field record
hdr.gx=(int)(1000*sna->xsnap1); //First trace coordinate
fp=fileOpen(sna->file_snap,"_sbpn",append);
writePSnapshot(fp,mod,sna,&hdr,back->pn);
fclose(fp);
}
}
sna->tracl+=sna->nx;
return(0);
}