wave_writer(char* file, int number_channels, int samples_per_sec) : stream(file, file_stream::Writable), data_size(0), number_channels(number_channels), samples_per_sec(samples_per_sec) { write_header(); write_format(); start_data(); }
void verlet(cube &data_vector, double step_size, int time_steps, int n_planets, vec masses,double G,double epsilon){ mat accel(n_planets, 3); mat start_data(n_planets,6); accel.fill(0); start_data.fill(0); clock_t start,finish; start = clock(); //Evolve through time for(int t=0;t< time_steps-1;t++){ //Calculate inital acceleration accel_calculate(data_vector,masses,n_planets,accel,t,G,epsilon); for(int i=0; i<n_planets; i++){ for(int j=0; j <3; j++){ start_data(i,j) = data_vector(i,j,t); start_data(i,j+3) = data_vector(i,j+3,t); } for(int j = 0; j<3; j++){ data_vector(i,j+3,t) = start_data(i,j+3) + 0.5*step_size*accel(i,j); data_vector(i,j,t+1) = start_data(i,j) + step_size*start_data(i, j+3) + 0.5*step_size*step_size*accel(i,j); } } accel_calculate(data_vector,masses,n_planets,accel,t,G,epsilon); for(int i=0; i<n_planets; i++){ for(int j=0; j<3; j++){ data_vector(i,j+3,t) = data_vector(i, j+3,t) + 0.5*accel(i,j)*step_size; } } //Update new position for(int i=0; i<n_planets; i++){ for(int j=0; j<3; j++){ data_vector(i,j+3,t+1) = data_vector(i,j+3,t); } } //Return start values for(int i=0; i<n_planets; i++){ for(int j=0; j<3; j++){ data_vector(i,j,t) = start_data(i,j); data_vector(i,j+3,t) = start_data(i,j+3); } } } finish = clock(); cout << "Total Velocity-Verlet time = "<< ((float)(finish-start)/CLOCKS_PER_SEC)<<" sec" << endl; cout << "Velocity-Verlet time/step = "<< ((float)(finish-start)/CLOCKS_PER_SEC)/time_steps<<" sec" << endl; }
void xm_from() { unsigned long data_size, rsrc_size; char text[64]; if(receive_sync() == ACK) { receive_part(info, DATABYTES, 1); transname(info + I_NAMEOFF + 1, text, info[I_NAMEOFF]); define_name(text); data_size = get4(info + I_DLENOFF); rsrc_size = get4(info + I_RLENOFF); start_info(info, rsrc_size, data_size); start_data(); receive_part(out_buffer, data_size, 1); start_rsrc(); receive_part(out_buffer, rsrc_size, 0); end_file(); } }
void RK4_solve(cube &data_vector,double step_size,int time_steps, int n_planets,vec masses,double G,double epsilon){ //Define all the different variables used for the method mat k1(n_planets,6); mat k2(n_planets,6); mat k3(n_planets,6); mat k4(n_planets,6); mat start_data(n_planets,6); mat accel(n_planets,3); k1.fill(0); k2.fill(0); k3.fill(0); k4.fill(0); start_data.fill(0); accel.fill(0); //Evolve through time clock_t start,finish; start = clock(); for(int t=0;t< time_steps-1;t++){ //Calculate inital acceleration accel_calculate(data_vector,masses,n_planets,accel,t,G,epsilon); for(int i=0;i< n_planets;i++){ //Set start data for(int j=0;j<6;j++){ start_data(i,j) = data_vector(i,j,t); //Calculate k1 for each dim for(int j=0;j<3;j++){ k1(i,j)= step_size*data_vector(i,3+j,t); k1(i,3+j)= step_size*accel(i,j); } } //Save temp vel for(int j=0;j<6;j++){ data_vector(i,j,t)= start_data(i,j) +k1(i,j)/2.; } } //end k1 step //Calculate new acceleration at this temporary position accel_calculate(data_vector,masses,n_planets,accel,t,G,epsilon); for(int i=0;i<n_planets;i++){ //Calculate k2 for each dim k2(i,0)= step_size*data_vector(i,3,t); k2(i,1)= step_size*data_vector(i,4,t); k2(i,2)= step_size*data_vector(i,5,t); k2(i,3)= step_size*accel(i,0); k2(i,4)= step_size*accel(i,1); k2(i,5)= step_size*accel(i,2); //Save temp pos & temp vel data_vector(i,0,t)= start_data(i,0) +k2(i,0)/2.; data_vector(i,1,t)= start_data(i,1) +k2(i,1)/2.; data_vector(i,2,t)= start_data(i,2) +k2(i,2)/2.; data_vector(i,3,t)= start_data(i,3) +k2(i,3)/2.; data_vector(i,4,t)= start_data(i,4) +k2(i,4)/2.; data_vector(i,5,t)= start_data(i,5) +k2(i,5)/2.; } //Calculate new acceleration again accel_calculate(data_vector,masses,n_planets,accel,t,G,epsilon); for(int i=0;i<n_planets;i++){ //Calculate k3 for each dim k3(i,0)= step_size*data_vector(i,3,t); k3(i,1)= step_size*data_vector(i,4,t); k3(i,2)= step_size*data_vector(i,5,t); k3(i,3)= step_size*accel(i,0); k3(i,4)= step_size*accel(i,1); k3(i,5)= step_size*accel(i,2); //Save temp vel and pos data_vector(i,0,t)= start_data(i,0) +k3(i,0); data_vector(i,1,t)= start_data(i,1) +k3(i,1); data_vector(i,2,t)= start_data(i,2) +k3(i,2); data_vector(i,3,t)= start_data(i,3) +k3(i,3); data_vector(i,4,t)= start_data(i,4) +k3(i,4); data_vector(i,5,t)= start_data(i,5) +k3(i,5); } //Calculate new acceleration again accel_calculate(data_vector,masses,n_planets,accel,t,G,epsilon); for(int i=0;i<n_planets;i++){ //Calculate k4 for each dim k4(i,0)= step_size*data_vector(i,3,t); k4(i,1)= step_size*data_vector(i,4,t); k4(i,2)= step_size*data_vector(i,5,t); k4(i,3)= step_size*accel(i,0); k4(i,4)= step_size*accel(i,1); k4(i,5)= step_size*accel(i,2); //Return start position to data_vector data_vector(i,0,t)= start_data(i,0); data_vector(i,1,t)= start_data(i,1); data_vector(i,2,t)= start_data(i,2); data_vector(i,3,t)= start_data(i,3); data_vector(i,4,t)= start_data(i,4); data_vector(i,5,t)= start_data(i,5); } for(int i=0;i<n_planets;i++){ //Update new position for(int j=0;j<6;j++){ data_vector(i,j,t+1) = data_vector(i,j,t) + 1/6.*(k1(i,j) + 2.*k2(i,j) + 2.*k3(i,j) + k4(i,j)); } } } finish = clock(); cout << "Total RK4 time = "<< ((float)(finish-start)/CLOCKS_PER_SEC)<<" sec" << endl; cout << "RK4 time/step = "<< ((float)(finish-start)/CLOCKS_PER_SEC)/time_steps<<" sec" << endl; }