43 template<
class PLayout>
59 template<
class PLayout>
88 template<
class PLayout>
96 template<
class PLayout>
106 template <
class PLayout>
113 size_t localNum = this->getLocalNum();
116 if (myNode == (
unsigned int) master) {
118 for (ip=0; ip<localNum; ++ip)
121 if (nodes == 1)
return;
125 lp =
new size_t[nodes];
130 for (ip=1; ip<nodes; ++ip) {
134 msg1->
get(lp[rnode]);
139 size_t current,
sum = 0;
140 for (ip=0; ip<nodes; ++ip) {
147 for (ip=1; ip<nodes; ++ip) {
164 size_t initialID = 0;
168 msg2->
get(initialID);
171 for (ip=0; ip<localNum; ++ip)
172 this->ID[ip] = ip + initialID;
181 template<
class PLayout>
200 for ( ; abeg != aend; abeg++ )
201 (*abeg)->putMessage(msg, M, I);
210 template<
class PLayout>
213 const std::vector<size_t>& putList)
219 std::vector<size_t>::size_type M = putList.size();
226 for ( ; abeg != aend; ++abeg )
227 (*abeg)->putMessage(msg, putList);
233 template<
class PLayout>
246 for ( ; abeg != aend; abeg++ )
247 (*abeg)->putMessage(msg, 1, I);
252 template<
class PLayout>
256 bool wasempty =
false;
257 if(this->getLocalNum()==0)
271 this->destroy(1, 0,
true);
276 template<
class PLayout>
280 msgbuf =
new MsgBuffer(this->getFormat(), list.size());
282 for (
unsigned int i = 0;i<list.size();++i)
291 template<
class PLayout>
296 msgbuf =
new MsgBuffer(this->getFormat(), list.size());
297 typename PLayout::SingleParticlePos_t oldpos;
298 for (
unsigned int i = 0;i<list.size();++i)
301 for(
int d = 0;d<
Dim;++d)
303 R[list[i]][d] += offset[i][d];
315 template<
class PLayout>
323 added += this->getSingleMessage(*msg);
331 template<
class PLayout>
339 added += this->ghostGetSingleMessage(*msg, node);
348 template<
class PLayout>
362 for ( ; abeg != aend; abeg++ )
363 (*abeg)->getMessage(msg, numitems);
371 template<
class PLayout>
384 for ( ; abeg != aend; abeg++ )
385 (*abeg)->getMessage(msg, numitems);
396 template<
class PLayout>
404 LocalNum += numcreate;
412 template<
class PLayout>
422 for ( ; abeg != aend; abeg++ )
426 size_t i1 = LocalNum;
429 ID[i1++] = getNextID();
439 template<
class PLayout>
449 for ( ; abeg != aend; abeg++ )
454 size_t i1 = LocalNum;
467 template<
class PLayout>
476 unsigned npLocal = np/nPE;
480 unsigned rem = np - npLocal * nPE;
481 if (myPE < rem) ++npLocal;
493 template<
class PLayout>
502 bool optDestroy = getUpdateFlag(PLayout::OPTDESTROY);
505 for (abeg = AttribList.begin(); abeg != aend; ++abeg)
506 (*abeg)->destroy(M,I,optDestroy);
511 std::pair<size_t,size_t> destroyEvent(I,M);
512 DestroyList.push_back(destroyEvent);
525 template<
class PLayout>
534 Layout->update(*
this);
542 template<
class PLayout>
551 Layout->update(*
this, &canSwap);
559 template<
class PLayout>
568 if (DestroyList.empty())
return;
571 bool isSorted =
true;
572 typedef std::vector< std::pair<size_t,size_t> > dlist_t;
573 dlist_t::const_iterator curr = DestroyList.begin();
574 const dlist_t::const_iterator last = DestroyList.end();
575 dlist_t::const_iterator next = curr + 1;
576 while (next != last && isSorted) {
577 if (*next++ < *curr++) isSorted =
false;
580 std::sort(DestroyList.begin(),DestroyList.end());
583 bool optDestroy = getUpdateFlag(PLayout::OPTDESTROY);
587 for (abeg = AttribList.begin(); abeg != aend; ++abeg)
588 (*abeg)->destroy(DestroyList,optDestroy);
590 if (updateLocalNum) {
591 for (curr = DestroyList.begin(); curr != last; ++ curr) {
592 LocalNum -= curr->second;
597 DestroyList.erase(DestroyList.begin(),DestroyList.end());
605 template<
class PLayout>
618 for ( ; abeg != aend; ++abeg )
619 dnum = (*abeg)->ghostDestroy(M, I);
629 template<
class PLayout>
639 if ((I + M) > (
R.size() + GhostNum))
640 M = (
R.size() + GhostNum) - I;
643 if ((I + M) >
R.size())
652 for ( ; abeg != aend; abeg++ )
653 (*abeg)->ghostPutMessage(msg, M, I);
664 template<
class PLayout>
667 const std::vector<size_t>& pl) {
672 std::vector<size_t>::size_type M = pl.size();
679 for ( ; abeg != aend; ++abeg )
680 (*abeg)->ghostPutMessage(msg, pl);
689 template<
class PLayout>
701 GhostNum += numitems;
707 for ( ; abeg != aend; abeg++ )
708 (*abeg)->ghostGetMessage(msg, numitems);
714 template<
class PLayout>
723 GhostNum += numitems;
729 for ( ; abeg != aend; abeg++ )
730 (*abeg)->ghostGetMessage(msg, numitems);
739 template<
class PLayout>
743 for ( ; abeg != aend; ++abeg )
744 (*abeg)->sort(sortlist);
750 template<
class PLayout>
751 std::ostream& operator<<(std::ostream& out, const IpplParticleBase<PLayout>& P) {
754 out <<
"Particle object contents:";
755 out <<
"\n Total particles: " << P.getTotalNum();
756 out <<
"\n Local particles: " << P.getLocalNum();
757 out <<
"\n Attributes (including R and ID): " << P.numAttributes();
758 out <<
"\n Layout = " << P.getLayout();
765 template<
class PLayout>
768 o <<
"PBase: total = " << getTotalNum() <<
", local = " << getLocalNum();
769 o <<
", attributes = " << AttribList.size() <<
endl;
770 for (attrib_container_t::size_type i=0; i < AttribList.size(); ++i) {
772 AttribList[i]->printDebug(o);
776 Layout->printDebug(o);
size_t ghostGetSingleMessage(Message &, int)
void initialize(PLayout *)
void ghostDestroy(size_t, size_t)
void destroy(size_t, size_t, bool=false)
void globalCreate(size_t np)
void performDestroy(bool updateLocalNum=false)
void printDebug(Inform &)
size_t readGhostMsgBuffer(MsgBuffer *, int)
T::PETE_Expr_t::PETE_Return_t sum(const PETE_Expr< T > &expr)
int next_tag(int t, int s=1000)
size_t getMessage(Message &)
size_t ghostGetMessage(Message &, int)
size_t writeMsgBufferWithOffsets(MsgBuffer *&, const std::vector< size_t > &, const std::vector< O > &)
size_t readMsgBuffer(MsgBuffer *)
void createWithID(unsigned id)
bool singleInitNode() const
#define INCIPPLSTAT(stat)
Message & get(const T &cval)
size_t putMessage(Message &, size_t, size_t)
Message & put(const T &val)
#define ADDIPPLSTAT(stat, amount)
size_t ghostPutMessage(Message &, size_t, size_t)
void getMessage(Message &m, T &t)
ParticleAttribBase::SortList_t SortList_t
std::string::iterator iterator
void putMessage(Message &m, const T &t)
size_t getMessageAndCreate(Message &)
Message * receive_block(int &node, int &tag)
static Communicate * Comm
bool send(Message *, int node, int tag, bool delmsg=true)
size_t writeMsgBuffer(MsgBuffer *&, const std::vector< size_t > &)
size_t getSingleMessage(Message &)
Inform & endl(Inform &inf)