Esempio n. 1
0
		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();
		}
Esempio n. 2
0
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;
}
Esempio n. 3
0
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();
    }
}
Esempio n. 4
0
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;
}