void evolve_system(uint32_t timesteps) { /* ******************************************* * * MAIN LOOP */ count_forces(); // function leap_frog() requries for (uint16_t ii=0; ii < timesteps; ii++) { leap_frog(); } }
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; }
/* * 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"); }
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); }