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); }
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; } }