void collisions_resolve(void) { #ifdef OPENMP omp_lock_t boundarylock; omp_init_lock(&boundarylock); #endif //OPENMP #pragma omp parallel for schedule (static,1) for (int proci=0; proci<sweeps_proc; proci++) { struct collision* c = clist[proci].collisions; int colN = clist[proci].N; total_collisions = total_collisions + colN; if (output_check(.1 * 2. * M_PI / 1.)) { printf("%f", total_collisions); // total_collisions = 0; } // Randomize array. for(int i=0; i<colN; i++) { int j = rand()%colN; struct collision ctemp = c[i]; c[i]=c[j]; c[j]=ctemp; } for(int i=0; i<colN; i++) { struct collision c1= c[i]; c1.gb = boundaries_get_ghostbox(0,0,0); particles[c1.p1].x -= c1.time*particles[c1.p1].vx; particles[c1.p1].y -= c1.time*particles[c1.p1].vy; particles[c1.p1].z -= c1.time*particles[c1.p1].vz; particles[c1.p2].x -= c1.time*particles[c1.p2].vx; particles[c1.p2].y -= c1.time*particles[c1.p2].vy; particles[c1.p2].z -= c1.time*particles[c1.p2].vz; #ifdef OPENMP if (c1.crossing) { omp_set_lock(&boundarylock); } #endif //OPENMP collision_resolve(c1); #ifdef OPENMP if (c1.crossing) { omp_unset_lock(&boundarylock); } #endif //OPENMP particles[c1.p1].x += c1.time*particles[c1.p1].vx; particles[c1.p1].y += c1.time*particles[c1.p1].vy; particles[c1.p1].z += c1.time*particles[c1.p1].vz; particles[c1.p2].x += c1.time*particles[c1.p2].vx; particles[c1.p2].y += c1.time*particles[c1.p2].vy; particles[c1.p2].z += c1.time*particles[c1.p2].vz; } clist[proci].N = 0; sweepphi[proci].N = 0; } #ifdef OPENMP omp_destroy_lock(&boundarylock); #endif //OPENMP }
void collisions_resolve(void){ // Loop over all collisions previously found in collisions_search(). for (int i=0;i<collisions_N;i++){ // Resolve collision collision_resolve(collisions[i]); } // Mark all collisions as resolved. collisions_N=0; }
void collisions_resolve(void){ // Loop over all collisions previously found in collisions_search(). for (int i=0;i<collisions_N;i++){ // Resolve collision collision_resolve(collisions[i]); } total_collisions = total_collisions + collisions_N / 2.; if (output_check(.1 * 2. * M_PI / 1.)){ printf("%f", total_collisions); // total_collisions = 0; } // Mark all collisions as resolved. collisions_N=0; }