#include<stdlib.h> #include<stdio.h> #include<math.h> #include<assert.h> #include"par.h" #include"raytime.h" #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)) /** * Writes the source and receiver positions into a gridded file, * which has the same size as the input gridded model files. * Source positions have a value +1 and receivers -1. * * AUTHOR: * Jan Thorbecke (janth@xs4all.nl) * The Netherlands **/ int writesufile(char *filename, float *data, int n1, int n2, float f1, float f2, float d1, float d2); int writeSrcRecPos(modPar *mod, recPar *rec, srcPar *src, shotPar *shot) { FILE *fp; float *dum, sub_x0, sub_z0, dx, dz; int is, nx, nz, is0, ish, ix, iz, ndot, idx, idz; char tmpname[1024]; ndot = 2; nx = mod->nx; nz = mod->nz; dx = mod->dx; dz = mod->dz; sub_x0 = mod->x0; sub_z0 = mod->z0; // ibndx = mod.ioPx; // ibndz = mod.ioPz; // if (bnd.lef==4 || bnd.lef==2) ibndx += bnd.ntap; // if (bnd.top==4 || bnd.top==2) ibndz += bnd.ntap; /* write velocity field with positions of the sources */ dum = (float *)calloc(nx*nz, sizeof(float)); vmess("Positions: shot=%d src=%d rec=%d", shot->n, src->n, rec->n); /* source positions for random shots */ if (src->random) { sprintf(tmpname,"SrcPositions%d.txt",src->n); fp = fopen(tmpname, "w+"); for (is=0; is<src->n; is++) { for (idx=0; idx<=ndot; idx++) { for (idz=0; idz<=ndot; idz++) { dum[(MAX(0,src->x[is]-idx))*nz+MAX(0,src->z[is]-idz)] = 1.0; dum[(MAX(0,src->x[is]-idx))*nz+MIN(nz-1,src->z[is]+idz)] = 1.0; dum[(MIN(nx-1,src->x[is]+idx))*nz+MIN(nz-1,src->z[is]+idz)] = 1.0; dum[(MIN(nx-1,src->x[is]+idx))*nz+MAX(0,src->z[is]-idz)] = 1.0; } } fprintf(fp, "%f %f\n", src->z[is]*dz+sub_z0, src->x[is]*dx+sub_x0); } fclose(fp); } /* source positions for single shot sources with plane waves */ else if (src->plane) { is0 = -1*floor((src->n-1)/2); sprintf(tmpname,"SrcPositions%d.txt",shot->n); fp = fopen(tmpname, "w+"); for (ish=0; ish<shot->n; ish++) { for (is=0; is<src->n; is++) { ix = shot->x[ish] + 1 + is0 + is; iz = shot->z[ish] + 1; dum[ix*nz+iz] = 1.0; dum[(MAX(0,ix-1))*nz+iz] = 1.0; dum[(MIN(nx-1,ix+1))*nz+iz] = 1.0; dum[ix*nz+MAX(0,iz-1)] = 1.0; dum[ix*nz+MIN(nz-1,iz+1)] = 1.0; fprintf(fp, "(%f, %f)\n", ix*dx+sub_x0, iz*dz+sub_z0); } } fclose(fp); } else if (src->multiwav) { /* source positions for single shot sources with multiple wavelets */ sprintf(tmpname,"SrcPositions%d.txt",shot->n); fp = fopen(tmpname, "w+"); for (ish=0; ish<shot->n; ish++) { for (is=0; is<src->n; is++) { ix = src->x[is]; iz = src->z[is]; dum[ix*nz+iz] = 1.0; dum[(MAX(0,ix-1))*nz+iz] = 1.0; dum[(MIN(nx-1,ix+1))*nz+iz] = 1.0; dum[ix*nz+MAX(0,iz-1)] = 1.0; dum[ix*nz+MIN(nz-1,iz+1)] = 1.0; fprintf(fp, "(%f, %f)\n", ix*dx+sub_x0, iz*dz+sub_z0); } } fclose(fp); } else { sprintf(tmpname,"SrcPositions%d.txt",shot->n); fp = fopen(tmpname, "w+"); for (is=0; is<shot->n; is++) { for (idx=0; idx<=ndot; idx++) { for (idz=0; idz<=ndot; idz++) { dum[(MAX(0,shot->x[is]-idx))*nz+MAX(0,shot->z[is]-idz)] = 1.0; dum[(MAX(0,shot->x[is]-idx))*nz+MIN(nz-1,shot->z[is]+idz)] = 1.0; dum[(MIN(nx-1,shot->x[is]+idx))*nz+MIN(nz-1,shot->z[is]+idz)] = 1.0; dum[(MIN(nx-1,shot->x[is]+idx))*nz+MAX(0,shot->z[is]-idz)] = 1.0; } } fprintf(fp, "%f %f\n", shot->z[is]*dz+sub_z0, shot->x[is]*dx+sub_x0); } fclose(fp); } /* receiver positions */ sprintf(tmpname,"RcvPositions%d.txt",rec->n); fp = fopen(tmpname, "w+"); for (is=0; is<rec->n; is++) { dum[rec->x[is]*nz+rec->z[is]] = -1.0; dum[(MAX(0,rec->x[is]-1))*nz+rec->z[is]] = -1.0; dum[(MIN(nx-1,rec->x[is]+1))*nz+rec->z[is]] = -1.0; dum[rec->x[is]*nz+MAX(0,rec->z[is]-1)] = -1.0; dum[rec->x[is]*nz+MIN(nz-1,rec->z[is]+1)] = -1.0; // vmess("receiver position %d at grid[ix=%d, iz=%d] = (x=%f z=%f)", ir, ix+ioPx, rec.z[ir]+ioPz, rec.xr[ir]+mod.x0, rec.zr[ir]+mod.z0); fprintf(fp, "(%f, %f)\n", rec->x[is]*dx+sub_x0, rec->z[is]*dz+sub_z0); } fclose(fp); writesufile("SrcRecPositions.su", dum, nz, nx, sub_z0, sub_x0, dz, dx); free(dum); return 0; }