int main(int argc, char* argv[]) { sf_file Fi=NULL, Fo=NULL, Fr=NULL; /* I/O files */ bool adj, verb, linear; sf_axis ax,az,at,ag; int ix,iz,it,ig; int nx,nz,nt,ng; float dx,dz,x0,z0; float **mapCC=NULL, **mapRC=NULL; float ***comCC=NULL, ***comRC=NULL; sf_complex **rays=NULL; int nn,ii; bool comp; /* complex input */ /* init RSF */ sf_init(argc,argv); Fi = sf_input ( "in"); Fr = sf_input ("rays"); Fo = sf_output( "out"); if(! sf_getbool( "verb",&verb )) verb=false; if(! sf_getbool( "adj",&adj )) adj=false; if(! sf_getbool("linear",&linear )) linear=true; ag=sf_iaxa(Fr,1); ng=sf_n(ag); if(verb) sf_raxa(ag); at=sf_iaxa(Fr,2); nt=sf_n(at); if(verb) sf_raxa(at); if(adj) { if(! sf_getint ("a2n",&nz)) nz=1; if(! sf_getfloat("a2o",&z0)) z0=0.; if(! sf_getfloat("a2d",&dz)) dz=1.; az = sf_maxa(nz,z0,dz); sf_setlabel(az,"a2"); if(verb) sf_raxa(az); if(! sf_getint ("a1n",&nx)) nx=1; if(! sf_getfloat("a1o",&x0)) x0=0.; if(! sf_getfloat("a1d",&dx)) dx=1.; ax = sf_maxa(nx,x0,dx); sf_setlabel(ax,"a1"); if(verb) sf_raxa(ax); sf_oaxa(Fo,ax,1); sf_oaxa(Fo,az,2); } else { ax = sf_iaxa(Fi,1); nx=sf_n(ax); if(verb) sf_raxa(ax); az = sf_iaxa(Fi,2); nz=sf_n(az); if(verb) sf_raxa(az); sf_oaxa(Fo,ag,1); sf_oaxa(Fo,at,2); } nn = sf_leftsize(Fi,2); rays =sf_complexalloc2(ng,nt); sf_complexread(rays[0],ng*nt,Fr); c2r_init(ax,az,ag,at,verb); /*------------------------------------------------------------*/ comp=false; if(SF_COMPLEX == sf_gettype(Fi)) comp=true; /*------------------------------------------------------------*/ mapCC=sf_floatalloc2(nx,nz); mapRC=sf_floatalloc2(ng,nt); if(comp) { comCC=sf_floatalloc3(2,nx,nz); comRC=sf_floatalloc3(2,ng,nt); for(ii=0;ii<nn;ii++) { sf_warning("%d of %d;",ii,nn); if(adj) { sf_floatread (comRC[0][0],2*ng*nt,Fi); /* REAL */ LOOPRC( mapRC[it][ig] = comRC[it][ig][0]; ); c2r(linear,adj,mapCC,mapRC,rays); LOOPCC( comCC[iz][ix][0] = mapCC[iz][ix]; ); /* IMAGINARY */ LOOPRC( mapRC[it][ig] = comRC[it][ig][1]; ); c2r(linear,adj,mapCC,mapRC,rays); LOOPCC( comCC[iz][ix][1] = mapCC[iz][ix]; );
static void convert ( multi * in, multi * out, int t_in, int t_out){ /* real types */ if(t_in == TYPE_FLOAT && t_out == TYPE_DOUBLE ) { out->d[0] = in->f[0]; return; } if(t_in == TYPE_DOUBLE && t_out == TYPE_FLOAT ){ out->f[0] = in->d[0]; return; } /* complex types */ if(t_in == TYPE_FLOAT_COMPLEX && t_out == TYPE_DOUBLE_COMPLEX ){ out->d[0] = in->f[0]; out->d[1] = in->f[1]; return; } if(t_in == TYPE_DOUBLE_COMPLEX && t_out == TYPE_FLOAT_COMPLEX ){ out->f[0] = in->d[0]; out->f[1] = in->d[1]; return; } /* real to complex */ if(t_in == TYPE_FLOAT && t_out == TYPE_FLOAT_COMPLEX ){ out->f[0] = in->f[0]; out->f[1] = (float) 0.0; return; } if(t_in == TYPE_DOUBLE && t_out == TYPE_FLOAT_COMPLEX ){ out->f[0] = in->d[0]; out->f[1] = (float) 0.0; return; } if(t_in == TYPE_FLOAT && t_out == TYPE_DOUBLE_COMPLEX ){ out->d[0] = in->f[0]; out->d[1] = (double) 0.0; return; } if(t_in == TYPE_DOUBLE && t_out == TYPE_DOUBLE_COMPLEX ){ out->d[0] = in->d[0]; out->d[1] = (double) 0.0; return; } /* complex to real */ if(t_in == TYPE_FLOAT_COMPLEX && t_out == TYPE_FLOAT ){ out->f[0] = c2r(in->f[0], in->f[1]); return; } if(t_in == TYPE_DOUBLE_COMPLEX && t_out == TYPE_FLOAT ){ out->f[0] = c2r(in->d[0], in->d[1]); return; } if(t_in == TYPE_FLOAT_COMPLEX && t_out == TYPE_DOUBLE ){ out->d[0] = c2r(in->f[0], in->f[1]); return; } if(t_in == TYPE_DOUBLE_COMPLEX && t_out == TYPE_DOUBLE ){ out->d[0] = c2r(in->d[0], in->d[1]); return; } }