예제 #1
0
int n_steps (struct world *world, int delta)
{
	int i; 
	int display_incrementally;
	int ret, ret2;

	if (abs (delta) < 10) {
		display_incrementally = 1; 
	} else {
		display_incrementally = 0;
	}

	if (delta<0) {
		for (i=0;i>delta;i--) {
			if ((ret=step_backward (world, display_incrementally)) != 0) break;
		}
	} else {
		for (i=0;i<delta;i++) {
			if ((ret=step_forward (world, display_incrementally)) != 0) break;
		}
	}

	if (!display_incrementally) {  
		if ((ret2=update_everything (world))!=0) return ret2;
	}
	
	return ret;
}
예제 #2
0
/* A round backward. If display is non-zero the display is updated. */
int round_backward (struct world *world, int display)
{
	int ret; 

	if ((ret=skip_round_markers (world, 0)) != 0) return ret;
	while (world->cursor && world->cursor->ant) {
		if ((ret=step_backward (world, display)) != 0) return ret;
	}
	return 0;
}
예제 #3
0
void CQPlayerControlWidget::slot_step_backward_clicked()
{
  if (this->mCurrentStep != 0)
    {
      --this->mCurrentStep;
    }

  this->updateButtons();
  this->updateActions();
  emit step_backward();
}
예제 #4
0
파일: fdf.c 프로젝트: acazuc/42_fdf
static void		do_move(t_world *world)
{
	if (world->rotate_up)
		rotate_up(world);
	if (world->rotate_down)
		rotate_down(world);
	if (world->rotate_left)
		rotate_left(world);
	if (world->rotate_right)
		rotate_right(world);
	if (world->move_down)
		world->position->y -= 1;
	if (world->move_up)
		world->position->y += 1;
	if (world->move_forward)
		step_forward(world);
	if (world->move_left)
		step_left(world);
	if (world->move_backward)
		step_backward(world);
	if (world->move_right)
		step_right(world);
}
예제 #5
0
파일: Mrtmadcig.c 프로젝트: 1014511134/src
int main(int argc, char* argv[])
{
	int it,kt,ia,is,i1,i2,tdmute,jsx,jsz,jgx,jgz,sxbeg,szbeg,gxbeg,gzbeg, distx, distz;
	int *sxz, *gxz;
	float tmp, amp, vmax;
	float *wlt, *d2x, *d1z, *bndr;
	float **v0, **vv, **dcal, **den;
	float **sp, **spz, **spx, **svz, **svx, **gp, **gpz, **gpx, **gvz, **gvx;
	float ***num, ***adcig;
    	sf_file vmodl, rtmadcig, vecx, vecz; /* I/O files */

    	sf_init(argc,argv);
#ifdef _OPENMP
    	omp_init();
#endif

    	/*< set up I/O files >*/
    	vmodl = sf_input ("in");   /* velocity model, unit=m/s */
    	rtmadcig = sf_output("out");  /* ADCIG obtained by Poynting vector */
	vecx=sf_output("vecx");
	vecz=sf_output("vecz");

    	/* get parameters for RTM */
    	if (!sf_histint(vmodl,"n1",&nz)) sf_error("no n1");
    	if (!sf_histint(vmodl,"n2",&nx)) sf_error("no n2");
    	if (!sf_histfloat(vmodl,"d1",&dz)) sf_error("no d1");
   	if (!sf_histfloat(vmodl,"d2",&dx)) sf_error("no d2");

    	if (!sf_getfloat("amp",&amp)) amp=1.e3;	
	/* maximum amplitude of ricker wavelet*/
    	if (!sf_getfloat("fm",&fm)) sf_error("no fm");	
	/* dominant freq of ricker */
    	if (!sf_getfloat("dt",&dt)) sf_error("no dt");	
	/* time interval */
    	if (!sf_getint("nt",&nt))   sf_error("no nt");	
	/* total modeling time steps */
    	if (!sf_getint("ns",&ns))   sf_error("no ns");	
	/* total shots */
    	if (!sf_getint("ng",&ng))   sf_error("no ng");	
	/* total receivers in each shot */
    	if (!sf_getint("nb",&nb))   nb=20; 
	/* thickness of split PML */
    	if (!sf_getint("na",&na)) na=30;
	/* number of angles*/
    	if (!sf_getint("kt",&kt))   kt=200;
	/* record poynting vector at kt */
	if (!sf_getint("jsx",&jsx))   sf_error("no jsx");
	/* source x-axis  jump interval  */
    	if (!sf_getint("jsz",&jsz))   jsz=0;
	/* source z-axis jump interval  */
    	if (!sf_getint("jgx",&jgx))   jgx=1;
	/* receiver x-axis jump interval */
    	if (!sf_getint("jgz",&jgz))   jgz=0;
	/* receiver z-axis jump interval */
    	if (!sf_getint("sxbeg",&sxbeg))   sf_error("no sxbeg");
	/* x-begining index of sources, starting from 0 */
    	if (!sf_getint("szbeg",&szbeg))   sf_error("no szbeg");
	/* z-begining index of sources, starting from 0 */
    	if (!sf_getint("gxbeg",&gxbeg))   sf_error("no gxbeg");
	/* x-begining index of receivers, starting from 0 */
    	if (!sf_getint("gzbeg",&gzbeg))   sf_error("no gzbeg");
	/* z-begining index of receivers, starting from 0 */
	if (!sf_getbool("csdgather",&csdgather)) csdgather=true;
	/* default, common shot-gather; if n, record at every point*/
	if (!sf_getfloat("vmute",&vmute))   vmute=1500;
	/* muting velocity to remove the low-freq noise, unit=m/s*/
	if (!sf_getint("tdmute",&tdmute))   tdmute=2./(fm*dt);
	/* number of deleyed time samples to mute */

	_dx=1./dx;
	_dz=1./dz;
	nzpad=nz+2*nb;
	nxpad=nx+2*nb;
	da=SF_PI/(float)na;/* angle unit, rad; */
	var=da/3.;
	var=2.0*var*var;

    	sf_putint(rtmadcig,"n1",nz);
    	sf_putint(rtmadcig,"n2",nx);
	sf_putfloat(rtmadcig,"n3",na);
    	sf_putfloat(rtmadcig,"d1",dz);
    	sf_putfloat(rtmadcig,"d2",dx);
	sf_putfloat(rtmadcig,"d3",90./(float)na);

	/* allocate variables */
	wlt=sf_floatalloc(nt);
	v0=sf_floatalloc2(nz,nx); 	
	vv=sf_floatalloc2(nzpad, nxpad);
	sp =sf_floatalloc2(nzpad, nxpad);
	spz=sf_floatalloc2(nzpad, nxpad);
	spx=sf_floatalloc2(nzpad, nxpad);
	svz=sf_floatalloc2(nzpad, nxpad);
	svx=sf_floatalloc2(nzpad, nxpad);
	gp =sf_floatalloc2(nzpad, nxpad);
	gpz=sf_floatalloc2(nzpad, nxpad);
	gpx=sf_floatalloc2(nzpad, nxpad);
	gvz=sf_floatalloc2(nzpad, nxpad);
	gvx=sf_floatalloc2(nzpad, nxpad);
	d1z=sf_floatalloc(nzpad);
	d2x=sf_floatalloc(nxpad);
	sxz=sf_intalloc(ns);
	gxz=sf_intalloc(ng);
	dcal=sf_floatalloc2(ng,nt);
	bndr=(float*)malloc(nt*8*(nx+nz)*sizeof(float));
	den=sf_floatalloc2(nz,nx);
	num=sf_floatalloc3(nz,nx,na);
	adcig=sf_floatalloc3(nz,nx,na);

	/* initialize variables */
	for(it=0;it<nt;it++){
		tmp=SF_PI*fm*(it*dt-1.0/fm);tmp*=tmp;
		wlt[it]=amp*(1.0-2.0*tmp)*expf(-tmp);
	}
	sf_floatread(v0[0],nz*nx,vmodl);
	expand2d(vv, v0);
	memset(sp [0],0,nzpad*nxpad*sizeof(float));
	memset(spx[0],0,nzpad*nxpad*sizeof(float));
	memset(spz[0],0,nzpad*nxpad*sizeof(float));
	memset(svx[0],0,nzpad*nxpad*sizeof(float));
	memset(svz[0],0,nzpad*nxpad*sizeof(float));
	memset(gp [0],0,nzpad*nxpad*sizeof(float));
	memset(gpx[0],0,nzpad*nxpad*sizeof(float));
	memset(gpz[0],0,nzpad*nxpad*sizeof(float));
	memset(gvx[0],0,nzpad*nxpad*sizeof(float));
	memset(gvz[0],0,nzpad*nxpad*sizeof(float));
	vmax=v0[0][0];
	for(i2=0; i2<nx; i2++)
	for(i1=0; i1<nz; i1++)
		vmax=SF_MAX(v0[i2][i1],vmax);
	pmlcoeff_init(d1z, d2x, vmax);
	if (!(sxbeg>=0 && szbeg>=0 && sxbeg+(ns-1)*jsx<nx && szbeg+(ns-1)*jsz<nz))	
	{ sf_error("sources exceeds the computing zone!"); exit(1);}
	sg_init(sxz, szbeg, sxbeg, jsz, jsx, ns);
	distx=sxbeg-gxbeg;
	distz=szbeg-gzbeg;
	if (csdgather)	{
		if (!(gxbeg>=0 && gzbeg>=0 && gxbeg+(ng-1)*jgx<nx && gzbeg+(ng-1)*jgz<nz &&
		(sxbeg+(ns-1)*jsx)+(ng-1)*jgx-distx <nx  && (szbeg+(ns-1)*jsz)+(ng-1)*jgz-distz <nz))	
		{ sf_error("geophones exceeds the computing zone!"); exit(1);}
	}else{
		if (!(gxbeg>=0 && gzbeg>=0 && gxbeg+(ng-1)*jgx<nx && gzbeg+(ng-1)*jgz<nz))	
		{ sf_error("geophones exceeds the computing zone!"); exit(1);}
	}
	sg_init(gxz, gzbeg, gxbeg, jgz, jgx, ng);
	memset(adcig[0][0], 0, na*nz*nx*sizeof(float));

	for(is=0; is<ns; is++)
	{
		wavefield_init(sp, spz, spx, svz, svx);
		if (csdgather)	{
			gxbeg=sxbeg+is*jsx-distx;
			sg_init(gxz, gzbeg, gxbeg, jgz, jgx, ng);
		}
		for(it=0; it<nt; it++)
		{
			add_source(&sxz[is], sp, 1, &wlt[it], true);
			step_forward(sp, spz, spx, svz, svx, vv, d1z, d2x);
			bndr_rw(false, svz, svx, &bndr[it*8*(nx+nz)]);
		
			record_seis(dcal[it], gxz, sp, ng);
			muting(dcal[it], gzbeg, szbeg, gxbeg, sxbeg+is*jsx, jgx, it, tdmute);
		}

		wavefield_init(gp, gpz, gpx, gvz, gvx);
		memset(num[0][0], 0, na*nz*nx*sizeof(float));
		memset(den[0], 0, nz*nx*sizeof(float));
		for(it=nt-1; it>-1; it--)
		{	
			add_source(gxz, gp, ng, dcal[it], true);
			step_forward(gp, gpz, gpx, gvz, gvx, vv, d1z, d2x);	

			if(it==kt)
			{
				window2d(v0,svx);
				sf_floatwrite(v0[0],nz*nx,vecx);
				window2d(v0,svz);
				sf_floatwrite(v0[0],nz*nx,vecz);
			}

			bndr_rw(true, svz, svx, &bndr[it*8*(nx+nz)]);	
			cross_correlation(num, den, sp, gp, svz, svx, gvz, gvx);

			step_backward(sp, svz, svx, vv);
			add_source(&sxz[is], sp, 1, &wlt[it], false);
		}	

		for(ia=0; ia<na; ia++)
		for(i2=0; i2<nx; i2++)
		for(i1=0; i1<nz; i1++)
			adcig[ia][i2][i1]+=num[ia][i2][i1]/(den[i2][i1]+SF_EPS);
	}
	sf_floatwrite(adcig[0][0], na*nz*nx,rtmadcig);

	free(wlt);
	free(*v0); free(v0);
	free(*vv); free(vv);
	free(*sp); free(sp);
	free(*spx); free(spx);
	free(*spz); free(spz);
	free(*svx); free(svx);
	free(*svz); free(svz);
	free(*gp); free(gp);
	free(*gpx); free(gpx);
	free(*gpz); free(gpz);
	free(*gvx); free(gvx);
	free(*gvz); free(gvz);
	free(d1z);
	free(d2x);
	free(sxz);
	free(gxz);
	free(bndr);
	free(*den); free(den);
	free(**num); free(*num); free(num);
	free(**adcig); free(*adcig); free(adcig);

    	exit(0);
}
예제 #6
0
/* Go to first position. If display is non-zero the display is updated. */
int goto_first (struct world *world, int display)
{
	while (step_backward (world, display) == 0) ;
	return 0;
}