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;
}