Example #1
0
int 
main(int argc, char *argv[])
{
    float timeStep = 0.1f;
    uint32_t nIntegrations = 1000;
    uint32_t num_particles_x = 16;
    uint32_t num_particles_y = 16;
    uint32_t num_particles = num_particles_x * num_particles_y;
    uint32_t num_levels = logf(num_particles) / logf(4.f);
    uint32_t num_coefficients = 4;
    uint32_t memory_size = 256 * 1024 * 1024;
    initialize_data(memory_size, num_particles_x, num_particles_y,
            num_levels, num_coefficients);

    for(uint32_t loop = 0; loop < nIntegrations; loop++) {
        calculate_multipoles();
        reset_forces();
        calculate_forces();
        integrate(timeStep);
    }

    const char filename[] = "out.txt";
    debug_write_positions_to_file(filename);

    return 0;
}
Example #2
0
void QUAN_MACRO_CAT(DATA_STRUCT,function)(){ 
    DATA_STRUCT::particle*  myParticles= 0;
    try{
        myParticles = new DATA_STRUCT::particle[DATA_STRUCT::num_particles];
        for( DATA_STRUCT::itime simulation_time
            = DATA_STRUCT::itime(0);
                simulation_time < DATA_STRUCT::max_time; 
                    simulation_time += DATA_STRUCT::timeStep){
            for(int i=0; i < DATA_STRUCT::num_particles; ++i){ 
                for(int j = i+1; j < DATA_STRUCT::num_particles; ++j){ 
                    quan::three_d::vect<DATA_STRUCT::force> f
                        = calculate_forces(myParticles[i], myParticles[j]); 
                    myParticles[i].apply_force(f); 
                    myParticles[j].apply_force(-f); 
                } 
                quan::three_d::vect<DATA_STRUCT::force> f_g
                    = DATA_STRUCT::single_particle_forces(myParticles[i]); 
                myParticles[i].apply_force(f_g); 
            } 
            for (int i = 0; i < DATA_STRUCT::num_particles; ++i){
                myParticles[i].update();
              //  std::cout << i << " " << myParticles[i] << '\n'; 
            }
            
        }
        delete [] myParticles;
   }
    catch (...){
        if (myParticles) delete [] myParticles;
        std::cout << "exception" <<'\n';
    }
} 
Example #3
0
void init_physics(simulation_t* sim)
{
int i;
calculate_forces(sim);
	for(i=0;i<sim->num_celestial_bodies;i++)sim->celestial_bodies[i].base.acceleration=vector_multiply(1/sim->celestial_bodies[i].base.mass,sim->celestial_bodies[i].base.force);
	for(i=0;i<sim->num_spacecraft;i++)sim->spacecraft[i].base.acceleration=vector_multiply(1/sim->spacecraft[i].base.mass,sim->spacecraft[i].base.force);
}
Example #4
0
void run_physics(simulation_t* sim)
{
int i,j;
double delta_t;
int iterations=1;

double max_delta_t=sim->current_spacecraft->firing?MAX_THRUSTING_DELTA_T:MAX_DELTA_T;
delta_t=DELTA_T*sim->speedup;
	if(delta_t>max_delta_t)
	{
	delta_t=max_delta_t;
	iterations=sim->speedup*(DELTA_T/max_delta_t);
	}

	while(iterations--)
    {
    //This bit might be removed
        for(i=0;i<sim->num_celestial_bodies;i++)object_step_position((object_t*)(sim->celestial_bodies+i),delta_t);
        calculate_forces(sim);
        for(i=0;i<sim->num_celestial_bodies;i++)object_step_velocity((object_t*)(sim->celestial_bodies+i),delta_t);


        for(i=0;i<sim->num_spacecraft;i++)
        {
        spacecraft_t* spacecraft=sim->spacecraft+i;
        spacecraft_run_physics(sim,spacecraft,delta_t);
        }
    }
}
Example #5
0
File: sph.cpp Project: dancsi/2DSPH
	void fluid::step( double dt )
	{
		prepare_step();

		/*STEP 1: calculate densities*/
		calculate_densities();
		glass_common_update(&fluid::calculate_glass_fluid_densities);

		/*if(simulator::detailed_logging)
		{
		printf("densities: ");
		for(int i=0;i<n;i++)
		{
		printf("%lf ", particles[i].density);
		if(particles[i].density!=density) system("pause");
		}
		printf("\n");
		}*/

		/*STEP 2: calculate forces*/
		calculate_forces();
		glass_common_update(&fluid::calculate_glass_fluid_forces);
		/*STEP 3: move particles*/
		update_positions(dt);
		set_bounding_particle_indices();
	}
Example #6
0
int main(int argc, char *argv[])
{
   int npts = 1500;
   int nsteps = 500;
   int outevery = 1;
   int simulation = SIM_RANDOM;
   int status;
   int output = 1;
   double dt = 0.01;
   double time = 0.;
   double tote = 0.;

   status = get_options(argc, argv, &npts, &nsteps, &output, &outevery, &simulation, &dt);
   if (status) return 0;

   pca_time tt,t;
   NBody *mydata;


   tick(&t);
   mydata=allocate_nbody(npts);
   printf("mydata has %d particles in a %d-dimensional space.\n",npts,NDIM);
  
   initialize_particles(mydata, npts, simulation);
  
   tick(&tt);
   calculate_forces(mydata, npts);
   calculate_energy(mydata, npts, &tote);
   tock(&tt);

   for (int i=0;i<nsteps;i++)
   {
      nbody_step(mydata,npts,dt);
      calculate_energy(mydata, npts, &tote);
      time += dt;
      if (output) {
         printf("%i\t%g\t%g\t%g\n", i, dt, time, tote);
//         if (!(i % outevery)) display_particles(mydata,1.3,npts);
      }
   }
  
  
   FILE *outfile=fopen("myparticles.txt","w");
   fprintf(outfile,"positions and forces are:\n");
   for (int i=0;i<npts;i++) 
   {
      for (int j=0;j<NDIM;j++)
         fprintf(outfile,"%12.6f ",mydata[i].x[j]);
      fprintf(outfile,"      ");
      for (int j=0;j<NDIM;j++)
         fprintf(outfile,"%12.6f ",mydata[i].f[j]);
      fprintf(outfile,"\n");
   }


   tock(&t);

   return 0;
}
Example #7
0
File: sph.cpp Project: dancsi/2DSPH
	void fluid::calculate_forces()
	{
		size_t pairs_cache_size=pairs_cache.size();
		//#pragma omp parallel for schedule(dynamic) 
		for(int i=0;i<pairs_cache_size;i++)
		{
			calculate_forces(pairs_cache[i]);
		}
	}
Example #8
0
int main(int argc,char **argv) {
	hupcpp::init(&argc, &argv);

#if 0
	if(argc!=5) {
		printf("(ERROR) USAGE: ./a.out <total bodies> <tileSize> <in data file> <out data file>\n");
		hupcpp::finalize();
	}
	assert(atoi(argv[1]) == NUMBODIES);
	assert(atoi(argv[2]) == TILESIZE);
	//Init(argv[3]);
#endif

	long start = get_usecs();
	for(int time_steps=0;time_steps<MAX_STEPS;time_steps++) {
		hupcpp::finish_spmd([=]() {
			if(upcxx::global_myrank() ==0) {
				calculate_forces();
			}
		});
	}
	long end = get_usecs();
 	double dur = ((double)(end-start))/1000000;
#ifdef VERIFY_SHORT
	counter_t sum = 0;
	for(int i=0; i<MAX_HCPP_WORKERS; i++) {
		sum+=TOTAL_COUNTS[i];
	}
	counter_t total_sum;
	upcxx::reduce<counter_t>(&sum, &total_sum, 1, 0, UPCXX_SUM, UPCXX_ULONG_LONG);
	if(upcxx::global_myrank() == 0) {
		const counter_t expected = NUMBODIES * MAX_STEPS;
		const char* res = expected == total_sum ? "PASSED" : "FAILED";
		printf("Test %s, Time = %0.3f\n",res,dur);
	}
#endif

#if 0
	// gather result from all other processes using upcxx_reduce
	float accx_all[NUMBODIES], accy_all[NUMBODIES], accz_all[NUMBODIES];
	upcxx::upcxx_reduce<float>(accx, accx_all, NUMBODIES, 0, UPCXX_SUM, UPCXX_FLOAT);
	upcxx::upcxx_reduce<float>(accy, accy_all, NUMBODIES, 0, UPCXX_SUM, UPCXX_FLOAT);
	upcxx::upcxx_reduce<float>(accz, accz_all, NUMBODIES, 0, UPCXX_SUM, UPCXX_FLOAT);

	if(upcxx::global_myrank() ==0) {
		printf("0: Computation done\n");
		printf("Test Passed=%d\n",verify_result(argv[4],accx_all));
	}
#endif

	hupcpp::barrier();
	hupcpp::finalize();
	return 0;
}
inline void FMMMLayout :: call_POSTPROCESSING_step(Graph& G,NodeArray<NodeAttributes>& A,
					     EdgeArray<EdgeAttributes>& E,NodeArray
					     <DPoint>& F,NodeArray<DPoint>& F_attr, 
					     NodeArray<DPoint>& F_rep,NodeArray<DPoint>
					     & last_node_movement)
{
  int i;

  for(i = 1; i<= 10; i++)
    calculate_forces(G,A,E,F,F_attr,F_rep,last_node_movement,i,1);

  if((resizeDrawing() == true))
    {
      adapt_drawing_to_ideal_average_edgelength(G,A,E);
      update_boxlength_and_cornercoordinate(G,A);
    }
  for(i = 1; i<= fineTuningIterations(); i++)
    calculate_forces(G,A,E,F,F_attr,F_rep,last_node_movement,i,2);
  if((resizeDrawing() == true))
    adapt_drawing_to_ideal_average_edgelength(G,A,E);
}
Example #10
0
/* kick-drift-kick */
void nbody_step(NBody *data, int n, double dt)
{
   for (int i=0;i<n;i++)
      for (int j=0;j<NDIM;j++) {
         data[i].x[j] += data[i].v[j]*dt;
      }
   calculate_forces(data, n);
   for (int i=0;i<n;i++)
      for (int j=0;j<NDIM;j++) {
         double a = data[i].f[j] / data[i].mass;
         data[i].v[j] += a*dt;
      }

   return;
}
Example #11
0
// Leapfrog integrator (Drift-Kick-Drift) for non-rotating frame.
void integrate_particles(void) {
  for(int i = 0; i < N; i++) {
    particles[i].x += 0.5 * dt * particles[i].vx;
    particles[i].y += 0.5 * dt * particles[i].vy;
    particles[i].z += 0.5 * dt * particles[i].vz;
  }
  calculate_forces();
  for(int i = 0; i < N; i++) {
    particles[i].vx += dt * particles[i].ax;
    particles[i].vy += dt * particles[i].ay;
    particles[i].vz += dt * particles[i].az;
    particles[i].x  += 0.5 * dt * particles[i].vx;
    particles[i].y  += 0.5 * dt * particles[i].vy;
    particles[i].z  += 0.5 * dt * particles[i].vz;
  }
}
Example #12
0
void FMMMLayout :: call_FORCE_CALCULATION_step(Graph& G,NodeArray<NodeAttributes>&A,
					 EdgeArray<EdgeAttributes>& E,int act_level, 
					 int max_level)
{
	const int ITERBOUND = 10000;//needed to guarantee termination if 
							 //stopCriterion() == scThreshold
	if(G.numberOfNodes() > 1)
	{
		int iter = 1;
		int max_mult_iter = get_max_mult_iter(act_level,max_level,G.numberOfNodes());
		double actforcevectorlength = threshold() + 1;

		NodeArray<DPoint> F_rep(G); //stores rep. forces 
		NodeArray<DPoint> F_attr(G); //stores attr. forces 
		NodeArray<DPoint> F (G); //stores resulting forces 
		NodeArray<DPoint> last_node_movement(G);//stores the force vectors F of the last
												//iterations (needed to avoid oszilations) 

		set_average_ideal_edgelength(G,E);//needed for easy scaling of the forces
		make_initialisations_for_rep_calc_classes(G);

		while( ((stopCriterion() == scFixedIterations)&&(iter <= max_mult_iter)) ||
			  ((stopCriterion() == scThreshold)&&(actforcevectorlength >= threshold())&&
			   (iter <= ITERBOUND)) ||
			  ((stopCriterion() == scFixedIterationsOrThreshold)&&(iter <= max_mult_iter) &&
			   (actforcevectorlength >= threshold())) )
		{//while
			calculate_forces(G,A,E,F,F_attr,F_rep,last_node_movement,iter,0);
			if(stopCriterion() != scFixedIterations)
				actforcevectorlength = get_average_forcevector_length(G,F);
			iter++;
		}//while

		if((act_level == 0))
			call_POSTPROCESSING_step(G,A,E,F,F_attr,F_rep,last_node_movement);
	 
		deallocate_memory_for_rep_calc_classes(); 
	}
}