示例#1
0
文件: Mc2r.c 项目: 1014511134/src
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]; );
示例#2
0
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;
  }

}