32 template<
class PLayout>
48 template<
class PLayout>
77 template<
class PLayout>
85 template<
class PLayout>
95 template <
class PLayout>
102 size_t localNum = this->getLocalNum();
105 if (myNode == (
unsigned int) master) {
107 for (ip=0; ip<localNum; ++ip)
110 if (nodes == 1)
return;
114 lp =
new size_t[nodes];
119 for (ip=1; ip<nodes; ++ip) {
123 msg1->
get(lp[rnode]);
128 size_t current,
sum = 0;
129 for (ip=0; ip<nodes; ++ip) {
136 for (ip=1; ip<nodes; ++ip) {
140 if (success ==
false) {
142 "IpplParticleBase<PLayout>::resetID()",
143 "sending initial ID values failed.");
155 if (success ==
false) {
157 "IpplParticleBase<PLayout>::resetID()",
158 "sending initial ID values failed.");
161 size_t initialID = 0;
165 msg2->
get(initialID);
168 for (ip=0; ip<localNum; ++ip)
169 this->ID[ip] = ip + initialID;
178 template<
class PLayout>
197 for ( ; abeg != aend; abeg++ )
198 (*abeg)->putMessage(msg, M, I);
207 template<
class PLayout>
210 const std::vector<size_t>& putList)
216 std::vector<size_t>::size_type M = putList.size();
223 for ( ; abeg != aend; ++abeg )
224 (*abeg)->putMessage(msg, putList);
230 template<
class PLayout>
243 for ( ; abeg != aend; abeg++ )
244 (*abeg)->putMessage(msg, 1, I);
249 template<
class PLayout>
253 bool wasempty =
false;
254 if(this->getLocalNum()==0)
268 this->destroy(1, 0,
true);
273 template<
class PLayout>
277 msgbuf =
new MsgBuffer(this->getFormat(), list.size());
279 for (
unsigned int i = 0;i<list.size();++i)
288 template<
class PLayout>
295 for (
unsigned int i = 0;i<list.size();++i)
298 for(
int d = 0;d<
Dim;++d)
300 R[list[i]][d] += offset[i][d];
312 template<
class PLayout>
320 added += this->getSingleMessage(*msg);
328 template<
class PLayout>
336 added += this->ghostGetSingleMessage(*msg, node);
345 template<
class PLayout>
359 for ( ; abeg != aend; abeg++ )
360 (*abeg)->getMessage(msg, numitems);
368 template<
class PLayout>
381 for ( ; abeg != aend; abeg++ )
382 (*abeg)->getMessage(msg, numitems);
393 template<
class PLayout>
401 LocalNum += numcreate;
409 template<
class PLayout>
419 for ( ; abeg != aend; abeg++ )
423 size_t i1 = LocalNum;
426 ID[i1++] = getNextID();
436 template<
class PLayout>
446 for ( ; abeg != aend; abeg++ )
451 size_t i1 = LocalNum;
464 template<
class PLayout>
473 unsigned npLocal = np/nPE;
477 unsigned rem = np - npLocal * nPE;
478 if (myPE < rem) ++npLocal;
490 template<
class PLayout>
502 for (abeg = AttribList.begin(); abeg != aend; ++abeg)
503 (*abeg)->destroy(M,I,optDestroy);
508 std::pair<size_t,size_t> destroyEvent(I,M);
509 DestroyList.push_back(destroyEvent);
522 template<
class PLayout>
531 Layout->update(*
this);
539 template<
class PLayout>
548 Layout->update(*
this, &canSwap);
556 template<
class PLayout>
565 if (DestroyList.empty())
return;
568 bool isSorted =
true;
569 typedef std::vector< std::pair<size_t,size_t> > dlist_t;
570 dlist_t::const_iterator curr = DestroyList.begin();
571 const dlist_t::const_iterator last = DestroyList.end();
572 dlist_t::const_iterator next = curr + 1;
573 while (next != last && isSorted) {
574 if (*next++ < *curr++) isSorted =
false;
577 std::sort(DestroyList.begin(),DestroyList.end());
584 for (abeg = AttribList.begin(); abeg != aend; ++abeg)
585 (*abeg)->destroy(DestroyList,optDestroy);
587 if (updateLocalNum) {
588 for (curr = DestroyList.begin(); curr != last; ++ curr) {
589 LocalNum -= curr->second;
594 DestroyList.erase(DestroyList.begin(),DestroyList.end());
602 template<
class PLayout>
615 for ( ; abeg != aend; ++abeg )
616 dnum = (*abeg)->ghostDestroy(M, I);
626 template<
class PLayout>
636 if ((I + M) > (
R.size() + GhostNum))
637 M = (
R.size() + GhostNum) - I;
640 if ((I + M) >
R.size())
649 for ( ; abeg != aend; abeg++ )
650 (*abeg)->ghostPutMessage(msg, M, I);
661 template<
class PLayout>
664 const std::vector<size_t>& pl) {
669 std::vector<size_t>::size_type M = pl.size();
676 for ( ; abeg != aend; ++abeg )
677 (*abeg)->ghostPutMessage(msg, pl);
686 template<
class PLayout>
698 GhostNum += numitems;
704 for ( ; abeg != aend; abeg++ )
705 (*abeg)->ghostGetMessage(msg, numitems);
711 template<
class PLayout>
720 GhostNum += numitems;
726 for ( ; abeg != aend; abeg++ )
727 (*abeg)->ghostGetMessage(msg, numitems);
736 template<
class PLayout>
740 for ( ; abeg != aend; ++abeg )
741 (*abeg)->sort(sortlist);
747 template<
class PLayout>
751 out <<
"Particle object contents:";
754 out <<
"\n Attributes (including R and ID): " << P.
numAttributes();
762 template<
class PLayout>
765 o <<
"PBase: total = " << getTotalNum() <<
", local = " << getLocalNum();
766 o <<
", attributes = " << AttribList.size() <<
endl;
767 for (attrib_container_t::size_type i=0; i < AttribList.size(); ++i) {
769 AttribList[i]->printDebug(o);
773 Layout->printDebug(o);
void putMessage(Message &m, const T &t)
void getMessage(Message &m, T &t)
std::ostream & operator<<(std::ostream &out, const IpplParticleBase< PLayout > &P)
T::PETE_Expr_t::PETE_Return_t sum(const PETE_Expr< T > &expr)
Inform & endl(Inform &inf)
#define ADDIPPLSTAT(stat, amount)
#define INCIPPLSTAT(stat)
std::string::iterator iterator
size_t getMessageAndCreate(Message &)
size_t getSingleMessage(Message &)
size_t ghostGetMessage(Message &, int)
void performDestroy(bool updateLocalNum=false)
size_t readMsgBuffer(MsgBuffer *)
size_t ghostPutMessage(Message &, size_t, size_t)
void initialize(PLayout *)
size_t getTotalNum() const
void ghostDestroy(size_t, size_t)
size_t getMessage(Message &)
size_t putMessage(Message &, size_t, size_t)
size_t writeMsgBuffer(MsgBuffer *&, const std::vector< size_t > &)
bool singleInitNode() const
ParticleAttribBase::SortList_t SortList_t
size_t writeMsgBufferWithOffsets(MsgBuffer *&, const std::vector< size_t > &, const std::vector< O > &)
attrib_container_t::size_type numAttributes() const
void printDebug(Inform &)
size_t getLocalNum() const
void globalCreate(size_t np)
size_t readGhostMsgBuffer(MsgBuffer *, int)
size_t ghostGetSingleMessage(Message &, int)
void createWithID(unsigned id)
void destroy(size_t, size_t, bool=false)
bool send(Message *, int node, int tag, bool delmsg=true)
Message * receive_block(int &node, int &tag)
Message & put(const T &val)
Message & get(const T &cval)
int next_tag(int t, int s=1000)
static Communicate * Comm