void partition_sort_particles(int64_t min, int64_t max, struct particle *particles, int64_t *assignments) { int64_t minpivot, maxpivot, pivot, i, si, tmp; struct particle tmp_p; if (max-min < 2) return; maxpivot = minpivot = assignments[min]; for (i=min+1; i<max; i++) { if (assignments[i] > maxpivot) maxpivot = assignments[i]; if (assignments[i] < minpivot) minpivot = assignments[i]; } if (minpivot==maxpivot) return; pivot = minpivot + (maxpivot-minpivot)/2; si = max-1; #define SWAP(a,b) {tmp_p = particles[a]; particles[a] = particles[b]; \ particles[b] = tmp_p; tmp = assignments[a]; \ assignments[a] = assignments[b]; assignments[b] = tmp;} for (i=min; i<si; i++) if (assignments[i] > pivot) { SWAP(i, si); si--; i--; } if (i==si && assignments[si]<=pivot) si++; #undef SWAP partition_sort_particles(min, si, particles, assignments); partition_sort_particles(si, max, particles, assignments); }
void build_fullfofs(void) { int64_t i, sf, last_sf=-1, f=-1; collapse_smallfofs(); num_smallfofs = 0; partition_sort_particles(0, num_particles, root_p, particle_smallfofs); for (i=0; i<num_particles; i++) { if (particle_smallfofs[i] < 0) continue; sf = particle_smallfofs[i]; if (sf != last_sf) { if (f>-1) { fofs[f].num_p = (root_p + i) - fofs[f].particles; } if ((f < 0) || (fofs[f].num_p >= MIN_HALO_PARTICLES)) f=add_new_fof(); fofs[f].particles = root_p + i; last_sf = sf; } } if (f>-1) { fofs[f].num_p = (root_p + i) - fofs[f].particles; if (fofs[f].num_p < MIN_HALO_PARTICLES) num_fofs--; } }