예제 #1
0
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);
}
예제 #2
0
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();
}
예제 #3
0
파일: RNAheat.c 프로젝트: wash/probing
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();
}