Ejemplo n.º 1
0
void ExplForwEuler(vec &v, int Nx, int Nt, double dx, double dt){
    vec v_next = zeros(Nx);
    mat sol    = zeros(Nx,Nt);
    vec us     = 1-linspace(0,1,Nx);

    sol.col(0) = v+us; // Save real solution u = v + us

    double dtxx = dt/(dx*dx);

    for(int j=1; j<Nt; j++){
        for(int i=1; i<Nx-1; i++){
            v_next(i) = dtxx*v(i-1) + (1-2*dtxx)*v(i) + dtxx*v(i+1);
        }
        v = v_next;

        sol.col(j) = v+us;
    }
    sol.save("ExplForwEuler.dat",raw_ascii);
}
Ejemplo n.º 2
0
Archivo: overlap.c Proyecto: IMSoP/CDex
void offset_adjust_settings(cdrom_paranoia *p, void(*callback)(long,int)){
  if(p->stage2.offpoints>=10){
    /* drift: look at the average offset value.  If it's over one
       sector, frob it.  We just want a little hysteresis [sp?]*/
    long av=(p->stage2.offpoints?p->stage2.offaccum/p->stage2.offpoints:0);
    
    if(abs(av)>p->dynoverlap/4){
      av=(av/MIN_SECTOR_EPSILON)*MIN_SECTOR_EPSILON;
      
      if(callback)(*callback)(ce(p->root.vector),PARANOIA_CB_DRIFT);
      p->dyndrift+=av;
      
      /* Adjust all the values in the cache otherwise we get a
	 (potentially unstable) feedback loop */
      {
	c_block *c=c_first(p);
	v_fragment *v=v_first(p);

	while(v && v->one){
	  /* safeguard beginning bounds case with a hammer */
	  if(fb(v)<av || cb(v->one)<av){
	    v->one=NULL;
	  }else{
	    fb(v)-=av;
	  }
	  v=v_next(v);
	}
	while(c){
	  long adj=min(av,cb(c));
	  c_set(c,cb(c)-adj);
	  c=c_next(c);
	}
      }

      p->stage2.offaccum=0;
      p->stage2.offmin=0;
      p->stage2.offmax=0;
      p->stage2.offpoints=0;
      p->stage2.newpoints=0;
      p->stage2.offdiff=0;
    }
  }

  if(p->stage1.offpoints>=10){
    /* dynoverlap: we arbitrarily set it to 4x the running difference
       value, unless min/max are more */

    p->dynoverlap=(p->stage1.offpoints?p->stage1.offdiff/
		   p->stage1.offpoints*3:CD_FRAMEWORDS);

    if(p->dynoverlap<-p->stage1.offmin*1.5)
      p->dynoverlap= - (long)( (double)p->stage1.offmin * 1.5 );
						     
    if(p->dynoverlap<p->stage1.offmax*1.5)
      p->dynoverlap = (long)( (double)p->stage1.offmax * 1.5 );

    if(p->dynoverlap<MIN_SECTOR_EPSILON)p->dynoverlap=MIN_SECTOR_EPSILON;
    if(p->dynoverlap>MAX_SECTOR_OVERLAP*CD_FRAMEWORDS)
      p->dynoverlap=MAX_SECTOR_OVERLAP*CD_FRAMEWORDS;
    			     
    if(callback)(*callback)(p->dynoverlap,PARANOIA_CB_OVERLAP);

    if(p->stage1.offpoints>600){ /* bit of a bug; this routine is
				    called too often due to the overlap 
				    mesh alg we use in stage 1 */
      p->stage1.offpoints = (long)( (double)p->stage1.offpoints / 1.2 );
      p->stage1.offaccum = (long)( (double)p->stage1.offaccum / 1.2);
      p->stage1.offdiff = (long)( (double) p->stage1.offdiff / 1.2 );
    }
    p->stage1.offmin=0;
    p->stage1.offmax=0;
    p->stage1.newpoints=0;
  }
}