72 size_t TotalNum = PData.getTotalNum();
73 size_t LocalNum = PData.getLocalNum();
74 size_t DestroyNum = PData.getDestroyNum();
75 float Weight = 1.0 / (float)N;
86 PData.performDestroy();
89 LocalNum -= DestroyNum;
92 PData.setTotalNum(LocalNum);
93 PData.setLocalNum(LocalNum);
102 int node, sendnum, recnum;
110 nodedata[0] = LocalNum;
111 nodedata[1] = DestroyNum;
113 msg->
put(nodedata, nodedata + 2);
130 int notrecvd = N - 1;
131 while (notrecvd > 0) {
139 LocalSize[node] = nodedata[0] - nodedata[1];
149 for (i = 0; i < N; i++) {
150 Change[i] = (int)((
float)TotalNum * Weight);
153 accounted -= TotalNum;
155 while (accounted != 0) {
156 Change[(-accounted) % N]++;
161 while (accounted != 0) {
162 if (
Change[whichnode] > 0) {
166 whichnode = (whichnode + 1) % N;
169 for (i = 0; i < N; i++) {
174 for (i = 0; i < N; i++) {
180 for (i = 0; i < N; i++) {
182 nodedata[0] = TotalNum;
192 msg->
put(nodedata, nodedata + 3);
197 for (j = 0; j < N &&
MsgCount[i] < 0; j++) {
206 msg->
put(nodedata, nodedata + 2);
220 TotalNum = nodedata[0];
221 sendnum = nodedata[1];
222 recnum = nodedata[2];
227 PData.performDestroy();
228 LocalNum -= DestroyNum;
234 while (sendnum > 0) {
237 LocalNum -= nodedata[1];
238 sendnum -= nodedata[1];
245 PData.putMessage(*sendmsg, nodedata[1], LocalNum);
249 PData.destroy(nodedata[1], LocalNum,
true);
253 while (sendnum > 0) {
259 int delpart = LocalNum-1;
260 for (
int ip=0; ip<nodedata[1]; ip++) {
261 while ( !(
bool((*canSwap)[delpart])) ) { --delpart; }
262 PData.putMessage(*sendmsg, 1, delpart);
264 PData.destroy(1, delpart,
true);
266 LocalNum -= nodedata[1];
267 sendnum -= nodedata[1];
285 int recvamt = PData.getMessage(*msg);
294 PData.setTotalNum(TotalNum);
295 PData.setLocalNum(LocalNum);