58 int myNumPtcles = pattr.
size();
59 int numPtcles = pattr.
size();
65 for (
int pe = 1; pe < npes; pe++) {
67 msg->
get(otherNumPtcles);
69 numPtcles += otherNumPtcles;
77 msg->
put(myNumPtcles);
85 spap(pattr, 0, numPtcles - 1, 1, docomm);
90 spap(pattr, 0, pattr.
size() - 1, 1, docomm);
111 spap(pattr, i, i, 1, docomm);
119 int ibase,
int ibound,
int istride,
bool docomm) {
134 bool okParameters =
true;
136 (*PtclDbgInform) <<
"spap() error: ibase (= " << ibase
137 <<
") < lowest index value (= " << 0 <<
")" <<
endl;
138 okParameters =
false;
143 (*PtclDbgInform) <<
"spap() error: istride < 0 not implemented yet."
145 okParameters =
false;
148 if ((ibound < ibase) && !((ibase == 0) && (ibound == -1))) {
149 (*PtclDbgInform) <<
"spap() error: ibase (= " << ibase
150 <<
") > ibound (= " << ibound
151 <<
") not implemented yet." <<
endl;
152 okParameters =
false;
156 if (((ibound - ibase) != 0) && !((ibase == 0) && (ibound == -1))) {
157 (*PtclDbgInform) <<
"spap() error: istride = 0 but (ibound - ibase) = "
158 << (ibound - ibase) <<
endl;
159 okParameters =
false;
166 if (!okParameters)
return;
172 int myNumPtcles = pattr.
size();
174 int* numsPtcles =
new int[npes];
176 for (
int pe=0; pe<npes; pe++) {
178 if (pe == mype) numsPtcles[pe] = myNumPtcles;
185 for (
int pe=1; pe<npes; pe++) {
187 msg->
get(otherNumPtcles);
189 numsPtcles[pe] = numsPtcles[pe - 1] + otherNumPtcles;
192 msg2->
putmsg((
void *)numsPtcles,
sizeof(
int), npes);
197 msg->
put(myNumPtcles);
205 int myPtcleIndexBegin, myPtcleIndexEnd;
207 myPtcleIndexBegin = 0;
208 myPtcleIndexEnd = myNumPtcles - 1;
211 myPtcleIndexBegin = numsPtcles[mype - 1];
212 myPtcleIndexEnd = myPtcleIndexBegin + myNumPtcles - 1;
215 Index myRange(myPtcleIndexBegin, myPtcleIndexEnd, 1);
216 Index requestedRange(ibase, ibound, istride);
217 for (
int pe=0; pe < npes; pe++) {
219 if (myNumPtcles > 0) {
220 if (myRange.
touches(requestedRange)) {
222 int mybase = myRequestedRange.
first();
223 int mybound = myRequestedRange.
last();
225 <<
" GLOBAL ptcle index subrange (" << mybase
226 <<
" : " << mybound <<
" : " << istride
230 ((p+item*istride) <= mybound)); item++) {
234 << pattr[p + item*istride] <<
" ";
249 delete [] numsPtcles;
256 int myNumPtcles = pattr.
size();
258 WARNMSG(
endl <<
"spap(): Currently, if docomm=false you must specify "
259 <<
"an Inform object having INFORM_ALL_NODES as its "
260 <<
"printing-node specifier if you want to see output from "
261 <<
"any processor calling [e,s]pap(); the Inform object "
262 <<
"you're trying to use has "
264 <<
"N.B.: If you called setInform() and didn't also call "
265 <<
"setPtclDbgInform() you are getting the FldDbgInform object "
266 <<
"you set with setInform, which you may not have constructed "
267 <<
"with INFORM_ALL_NODES." <<
endl <<
endl);
270 if (myNumPtcles > 0) {
272 <<
" LOCAL ptcle index range (" << ibase
273 <<
" : " << ibound <<
" : " << istride <<
")...." <<
endl;
274 int length = (ibound - ibase)/istride + 1;
277 (item < length)); item++) {
279 << pattr[p + item*istride] <<
" ";
286 <<
" has no particles ...." <<
endl;
void epap(ParticleAttrib< T > &pattr, int i, bool docomm=true)
Index intersect(const Index &) const
void pap(ParticleAttrib< T > &pattr, bool docomm=true)
int next_tag(int t, int s=1000)
void spap(ParticleAttrib< T > &pattr, int ibase, int ibound, int istride, bool docomm=true)
void setPtclDbgInform(Inform &inform)
Message & putmsg(void *, int, int=0)
virtual int broadcast_others(Message *, int, bool delmsg=true)
Message & get(const T &cval)
bool touches(const Index &a) const
Message & put(const T &val)
Message * receive_block(int &node, int &tag)
static Communicate * Comm
bool send(Message *, int node, int tag, bool delmsg=true)
Inform & endl(Inform &inf)