/*! \file buildandsortarrays.cxx * \brief this file contains routines that build arrays used to sort/access the particle data local to the MPI domain */ #include "stf.h" /// \name Simple group id based array building and group id reordering routines //@{ ///build group size array Int_t *BuildNumInGroup(const Int_t nbodies, const Int_t numgroups, Int_t *pfof){ Int_t *numingroup=new Int_t[numgroups+1]; for (Int_t i=0;i<=numgroups;i++) numingroup[i]=0; for (Int_t i=0;i0) numingroup[pfof[i]]++; return numingroup; } ///build group size array for specific type Int_t *BuildNumInGroupTyped(const Int_t nbodies, const Int_t numgroups, Int_t *pfof, Particle *P, int type){ Int_t *numingroup=new Int_t[numgroups+1]; for (Int_t i=0;i<=numgroups;i++) numingroup[i]=0; for (Int_t i=0;i0 && P[i].GetType()==type) numingroup[pfof[i]]++; return numingroup; } ///build the group particle index list (assumes particles are in ID order) Int_t **BuildPGList(const Int_t nbodies, const Int_t numgroups, Int_t *numingroup, Int_t *pfof){ Int_t **pglist=new Int_t*[numgroups+1]; Int_t pid; pglist[0]=NULL; for (Int_t i=1;i<=numgroups;i++) { pglist[i] = NULL; if (numingroup[i]<=0) continue; pglist[i]=new Int_t[numingroup[i]]; numingroup[i]=0; } for (Int_t i=0;iioffset) Part[i].SetType(sortval[Part[i].GetID()]); else Part[i].SetType(nbodies+1);//here move all particles not in groups to the back of the particle array } qsort(Part, nbodies, sizeof(Particle), TypeCompare); if (numgroups >= 1) noffset[0]=noffset[1]=0; for (Int_t i=2;i<=numgroups;i++) noffset[i]=noffset[i-1]+numingroup[i-1]; for (Int_t i=0;i0) pq->Push(i, numingroup[i]); for (Int_t i = 1; i<=newnumgroups; i++) { groupid=pq->TopQueue();size=pq->TopPriority();pq->Pop(); for (Int_t j=0;j0) pq->Push(i, numingroup[i]); for (Int_t i = 1; i<=newnumgroups; i++) { groupid=pq->TopQueue();size=pq->TopPriority();pq->Pop(); for (Int_t j=0;j0) pq->Push(i, value[i]); for (Int_t i = 1; i<=newnumgroups; i++) { groupid=pq->TopQueue();pq->Pop(); for (Int_t j=0;j0) pq->Push(i, value[i]); for (Int_t i = 1; i <= newnumgroups; i++) { groupid=pq->TopQueue();pq->Pop(); for (Int_t j=0;j0) pq->Push(i, value[i]); for (Int_t i = 1; i <= newnumgroups; i++) { groupid=pq->TopQueue();pq->Pop(); for (Int_t j=0;j0) pq->Push(i, value[i]); for (Int_t i = 1; i <= newnumgroups; i++) { groupid=pq->TopQueue();pq->Pop(); for (Int_t j=0;j0) pq->Push(i, value[i]); for (Int_t i = 1; i <= newnumgroups; i++) { groupid=pq->TopQueue();pq->Pop(); for (Int_t j=0;j0) pq->Push(i, value[i]); for (Int_t i = 1; i <= newnumgroups; i++) { groupid=pq->TopQueue();pq->Pop(); for (Int_t j=0;j