NAMD
Functions
SortAtoms.h File Reference

Go to the source code of this file.

Functions

void sortAtomsForCUDA (int *order, const FullAtom *atoms, int nfree, int n)
 
void sortAtomsForPatches (int *order, int *breaks, const FullAtom *atoms, int nmgrps, int natoms, int ni, int nj, int nk)
 

Function Documentation

void sortAtomsForCUDA ( int *  order,
const FullAtom atoms,
int  nfree,
int  n 
)

Definition at line 116 of file SortAtoms.C.

References partition().

Referenced by HomePatch::positionsReady().

116  {
117 
118  // partition free atoms
119  // CkPrintf("%d %d\n", 0, nfree);
120  partition(order, atoms, 0, nfree);
121 
122  // partition fixed atoms
123  // CkPrintf("%d %d\n", nfree, n);
124  partition(order, atoms, nfree, n);
125 
126 }
static void partition(int *order, const FullAtom *atoms, int begin, int end)
Definition: SortAtoms.C:42
#define order
Definition: PmeRealSpace.C:235
void sortAtomsForPatches ( int *  order,
int *  breaks,
const FullAtom atoms,
int  nmgrps,
int  natoms,
int  ni,
int  nj,
int  nk 
)

Definition at line 129 of file SortAtoms.C.

References FullAtom::migrationGroupSize, and sort.

Referenced by WorkDistrib::createAtomLists().

131  {
132 
133 //CkPrintf("sorting %d atoms in %d groups to %d x %d x %d\n",
134 // natoms, nmgrps, nk, nj, ni);
135  std::sort(order, order+nmgrps, sortop_z(atoms));
136  int pid = 0;
137  int ibegin = 0;
138  int nai = 0;
139  for ( int ip=0; ip < ni; ++ip ) {
140  int naj = nai;
141  int targi = nai + (natoms - nai - 1) / (ni - ip) + 1;
142  int iend;
143  for ( iend=ibegin; iend<nmgrps; ++iend ) {
144  int mgs = atoms[order[iend]].migrationGroupSize;
145  if (nai + mgs <= targi) nai += mgs;
146  else break;
147  }
148 //CkPrintf(" Z %d %d (%d) %d\n", ibegin, iend, iend-ibegin, nai);
149  std::sort(order+ibegin, order+iend, sortop_y(atoms));
150  int jbegin = ibegin;
151  for ( int jp=0; jp < nj; ++jp ) {
152  int nak = naj;
153  int targj = naj + (nai - naj - 1) / (nj - jp) + 1;
154  int jend;
155  for ( jend=jbegin; jend<iend; ++jend ) {
156  int mgs = atoms[order[jend]].migrationGroupSize;
157  if (naj + mgs <= targj) naj += mgs;
158  else break;
159  }
160 
161 //CkPrintf(" Y %d %d (%d) %d\n", jbegin, jend, jend-jbegin, naj);
162  std::sort(order+jbegin, order+jend, sortop_x(atoms));
163  int kbegin = jbegin;
164  for ( int kp=0; kp < nk; ++kp ) {
165  int targk = nak + (naj - nak - 1) / (nk - kp) + 1;
166  int kend;
167  for ( kend=kbegin; kend<jend; ++kend ) {
168  int mgs = atoms[order[kend]].migrationGroupSize;
169  if (nak + mgs <= targk) nak += mgs;
170  else break;
171 //CkPrintf(" atom %d %d %.2f\n", atoms[order[kend]].id, mgs,
172 // atoms[order[kend]].position.x);
173  }
174 //CkPrintf(" X %d %d (%d) %d\n", kbegin, kend, kend-kbegin, nak);
175  breaks[pid++] = kend;
176  kbegin = kend;
177  }
178  jbegin = jend;
179  }
180  ibegin = iend;
181  }
182 
183 }
#define order
Definition: PmeRealSpace.C:235
int migrationGroupSize
Definition: NamdTypes.h:117
BlockRadixSort::TempStorage sort