예제 #1
0
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);
}
예제 #2
0
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--;
  }
}