static void test_accuracy(){ rand_t rstat; int seed=4; double r0=0.2; double dx=1./64.; long N=1+64; long nx=N; long ny=N; seed_rand(&rstat, seed); map_t *atm=mapnew(nx, ny, dx, dx,NULL); for(long i=0; i<nx*ny; i++){ atm->p[i]=randn(&rstat); } map_t *atm2=mapnew(nx, ny, dx, dx,NULL); for(long i=0; i<nx*ny; i++){ atm2->p[i]=randn(&rstat); } mapwrite(atm, "atm_rand.bin"); mapwrite(atm2, "atm2_rand.bin"); fractal_do((dmat*)atm, dx, r0,L0,ninit); mapwrite(atm, "atm_frac.bin"); fractal_inv((dmat*)atm, dx, r0,L0,ninit); mapwrite(atm, "atm_frac_inv.bin"); fractal_trans((dmat*)atm2, dx, r0,L0,ninit); mapwrite(atm2, "atm2_frac_trans.bin"); fractal_inv_trans((dmat*)atm2, dx, r0,L0,ninit); mapwrite(atm2, "atm2_frac_inv_trans.bin"); /* atm2 is u, atm is v, now comparing u'Av against v'A'u. they should be the same. A^-1Av should be the same as v A'^-1A'u should be the same as u. */ dmat *u=dread("atm2_rand.bin"); dmat *Atu=dread("atm2_frac_trans.bin"); dmat *Av=dread("atm_frac.bin"); dmat *v=dread("atm_rand.bin"); double dot1=dotdbl(u->p, Av->p, NULL, nx*ny); double dot2=dotdbl(v->p, Atu->p, NULL, nx*ny); info("dot1=%g, dot2=%g, diff=%g\n", dot1, dot2, dot1-dot2); dmat *u2=dread("atm2_frac_inv_trans.bin"); dmat *v2=dread("atm_frac_inv.bin"); double d1=ddiff(u, u2); double d2=ddiff(v, v2); info("d1=%g, d2=%g\n", d1, d2); }
/** normalize vector to sum to norm;*/ void normalize_sum(double *p, long nloc, double norm){ if(!nloc) return; double ss=norm/dotdbl(p,NULL,NULL,nloc); for(int i=0; i<nloc; i++){ p[i]*=ss; } }