Ejemplo n.º 1
0
void evolve_system(uint32_t timesteps)
{
    
    /* ******************************************* *
     *          MAIN LOOP
     */
    
    count_forces(); // function leap_frog() requries
    
    for (uint16_t ii=0; ii < timesteps; ii++)
    {
        leap_frog();
    }
}
Ejemplo n.º 2
0
int main ()
{
  /* Se crean las variables del hamiltoniano para resolver con Runge Kutta*/
  double q1_RK, q3_RK, p1_RK, p3_RK;
  
  /* Se crean las variables del hamiltoniano para resolver con el Integrador Simplectico*/
  double q1_LF, q3_LF, p1_LF, p3_LF;
  
  /* Distancia vertical entre los cuerpos masivos*/
  double eps=1.0;

  /* Tiempo total*/
  double T=2800;
  /* Paso de tiempo */
  double h=0.006;
  /* Numero de pasos*/
  int n=(int)(T/h);
  
  // Elementos aleatorios
  long seed;
  seed=n;
  srand48( seed );
  
  /* Condiciones iniciales*/
  q1_RK=q1_LF=0.35355;
  q3_RK=q3_LF=2*drand48()-1;
  p1_RK=p1_LF=0.0;
  p3_RK=p3_LF=2*drand48()-1;
  double t=0.0;
    
  int i;

  //Hamiltonianos
  double H1,H2;
  for (i=0;i<n;i++)
    {
      H1=0.5*pow(p1_RK,2) - 0.5*pow( (4*pow(q1_RK,2)+pow(eps,2)) ,-0.5);
      H2=0.5*pow(p1_LF,2) - 0.5*pow( (4*pow(q1_LF,2)+pow(eps,2)) ,-0.5);
      printf("%.6f %.6f %.4f\n",H1,H2,t);
      RK4(h,&q1_RK,&p1_RK,&q3_RK,&p3_RK,eps);
      leap_frog(h,&q1_LF,&p1_LF,&q3_LF,&p3_LF,eps);
      t+=h;
    }
  return 0;
}
Ejemplo n.º 3
0
/*
 * Perform simulation for arbitrary time of 3ps to termalize
 */
void termalize_system()
{
    const uint16_t time = 3; // time in ps
    const uint16_t timesteps = time*( (uint16_t) round(1./global.dt) );
    
    printf("# TERMALIZATION\n");
    printf("Performing termalization for %d timesteps with dt=%e [%.1lf ps]\n",timesteps,global.dt,(double) time);
    
    count_forces(); // function leap_frog() requries
    
    for (uint16_t ii=0; ii < timesteps; ii++)
    {
        leap_frog();
    }
    
    printf("Termalization done\n");
    printf("\n");
}
Ejemplo n.º 4
0
void perform_experiment(double time, uint16_t steps_per_stats, uint16_t steps_per_positions)
{
    uint16_t timesteps = ( (uint16_t) round(time/global.dt) );
    
//     double*     pressure_arr = malloc( timesteps * sizeof(double) );
//     double* sig_pressure_arr = malloc( timesteps * sizeof(double) );
//     double*     temp_arr     = malloc( timesteps * sizeof(double) );
//     double* sig_temp_arr     = malloc( timesteps * sizeof(double) );
    
    
    // ====================== FILES ==============================================
    /*
    //get current date
    char datetime[20];
    time_t t;
    time(&t);
    strftime(datetime, sizeof(datetime), "%F_%T", localtime(&t));
    */
    
    char dirname[256];
    sprintf( dirname,"Dane_dt=%e",global.dt);
    struct stat st = {0};
    if (stat(dirname, &st) == -1) { mkdir(dirname, 0777); }
    
    char filename_pT[256];
    sprintf( filename_pT,"pT_stats.txt");
    FILE* file_pT = fopen(filename_pT,"a");
    
    char filename_stats[256];
    sprintf( filename_stats,"%s/stats_T0=%.1lf.txt",dirname,global.T0);
    FILE* file_stats = fopen(filename_stats,"w");
    
    char filename_positions[256];
    sprintf( filename_positions,"%s/positions_T0=%.1lf.bin",dirname,global.T0);
    FILE* file_pos = fopen(filename_positions,"wb");
    
    char filename_momenta[256];
    sprintf( filename_momenta,"%s/momenta_T0=%.1lf.bin",dirname,global.T0);
    FILE* file_mom = fopen(filename_momenta,"wb");
    
    
    // ============================= MAIN LOOP =========================================
    
    double av_pressure = 0.;
    double u_pressure = 0.;
    double av_temp = 0.;
    double u_temp = 0.;
    
    printf("# Making simulation for %.1lf ps   [%d timesteps]\n",time,timesteps);
    
    count_forces(); // function leap_frog() requries
    
    for (uint16_t ii=0; ii < timesteps; ii++)
    {
        // make algorithm step
        leap_frog();
        
        const double p = pressure();
        const double T = temperature();
        av_pressure += p/timesteps;
        u_pressure += p*p/timesteps;
        av_temp += T/timesteps;
        u_temp += T*T/timesteps;
        
        if (!(ii%steps_per_stats))
        {
            fprintf(file_stats,"%e\t%e\t%e\t%e\n",av_temp,u_temp,av_pressure,u_pressure);
        }
        else if (!(ii%steps_per_positions))
        {
            fwrite(global.x_arr,sizeof(double), global.N, file_pos);
            fwrite(global.y_arr,sizeof(double), global.N, file_pos);
            fwrite(global.z_arr,sizeof(double), global.N, file_pos);
            
            fwrite(global.px_arr,sizeof(double), global.N, file_mom);
            fwrite(global.py_arr,sizeof(double), global.N, file_mom);
            fwrite(global.pz_arr,sizeof(double), global.N, file_mom);
        }
    }
    
    // ========================= MEANS ========================================
    
    //av_temp /= timesteps;
    u_temp = sqrt( u_temp - av_temp*av_temp );
    //av_pressure /= timesteps;
    u_pressure = sqrt( u_pressure - av_pressure*av_pressure );
    
    //fprintf(file_pT,"\n","T","u(T)","p","u(p)");
    fprintf(file_pT,"%e\t%e\t%e\t%e\n",av_temp,u_temp,av_pressure,u_pressure);
    
    fclose(file_stats);
    fclose(file_pT);
    fclose(file_pos);
    fclose(file_mom);
    
//     free(pressure_arr);
//     free(sig_pressure_arr);
//     free(temp_arr);
//     free(sig_arr);
}