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); }
PRIVATE void heat_capacity(char *string, float T_min, float T_max, float h, int m) { int length, i; char *structure; float hc, kT, min_en; length = (int) strlen(string); do_backtrack = 0; temperature = T_min -m*h; /* initialize_fold(length); <- obsolete */ structure = (char *) vrna_alloc((unsigned) length+1); min_en = fold(string, structure); free(structure); free_arrays(); kT = (temperature+K0)*GASCONST/1000; /* in kcal */ pf_scale = exp(-(1.07*min_en)/kT/length ); /* init_pf_fold(length); <- obsolete */ vrna_exp_param_t *pf_parameters = NULL; vrna_md_t md; set_model_details(&md); pf_parameters = get_boltzmann_factors(temperature, 1.0, md, pf_scale); update_pf_params_par(length, pf_parameters); for (i=0; i<2*m+1; i++) { F[i] = pf_fold_par(string, NULL, pf_parameters, 0, 0, 0); /* T_min -2h */ md.temperature = temperature += h; kT = (temperature+K0)*GASCONST/1000; pf_scale=exp(-(F[i]/length +h*0.00727)/kT); /* try to extrapolate F */ free(pf_parameters); pf_parameters = get_boltzmann_factors(temperature, 1.0, md, pf_scale); update_pf_params_par(length, pf_parameters); } while (temperature <= (T_max+m*h+h)) { hc = - ddiff(F,h,m)* (temperature +K0 - m*h -h); printf("%g %g\n", (temperature-m*h-h), hc); for (i=0; i<2*m; i++) F[i] = F[i+1]; F[2*m] = pf_fold_par(string, NULL, pf_parameters, 0, 0, 0); /* printf("%g\n", F[2*m]);*/ temperature += h; kT = (temperature+K0)*GASCONST/1000; pf_scale=exp(-(F[i]/length +h*0.00727)/kT); free(pf_parameters); md.temperature = temperature; pf_parameters = get_boltzmann_factors(temperature, 1.0, md, pf_scale); update_pf_params_par(length, pf_parameters); } free_pf_arrays(); }
PRIVATE void heat_capacity(char *string, float T_min, float T_max, float h, int m) { int length, i; char *structure; float hc, kT, min_en; length = (int) strlen(string); do_backtrack = 0; temperature = T_min -m*h; initialize_fold(length); structure = (char *) space((unsigned) length+1); min_en = fold(string, structure); free(structure); free_arrays(); kT = (temperature+K0)*GASCONST/1000; /* in kcal */ pf_scale = exp(-(1.07*min_en)/kT/length ); init_pf_fold(length); for (i=0; i<2*m+1; i++) { F[i] = pf_fold(string, NULL); /* T_min -2h */ temperature += h; kT = (temperature+K0)*GASCONST/1000; pf_scale=exp(-(F[i]/length +h*0.00727)/kT); /* try to extrapolate F */ update_pf_params(length); } while (temperature <= (T_max+m*h+h)) { hc = - ddiff(F,h,m)* (temperature +K0 - m*h -h); printf("%g %g\n", (temperature-m*h-h), hc); for (i=0; i<2*m; i++) F[i] = F[i+1]; F[2*m] = pf_fold(string, NULL); temperature += h; kT = (temperature+K0)*GASCONST/1000; pf_scale=exp(-(F[i]/length +h*0.00727)/kT); update_pf_params(length); } free_pf_arrays(); }