1 #ifndef BOX_PARTICLE_CACHING_POLICY
2 #define BOX_PARTICLE_CACHING_POLICY
21 template<
class T,
unsigned Dim,
class Mesh>
60 for (
unsigned d=0; d<2*
Dim; ++d)
62 if(pBConds[d] == periodicBCond)
70 for (;localVN!=localVNend;++localVN)
77 for(
unsigned int d = 0;d<
Dim;++d)
84 std::fill(offset.
begin(), offset.
end(), 0);
87 for(
unsigned int d = 0;d<
Dim;++d)
89 if(
periodic[2*d] && (exdom[d].first() < globalDomain[d].first()))
91 offset[d] = globalDomain[d].length();
93 else if(
periodic[2*d+1] && (exdom[d].last() > globalDomain[d].last()))
95 offset[d] = -globalDomain[d].length();
100 std::fill(onoff, onoff+Dim, 0);
105 for(
unsigned int d = 0;d<
Dim;++d)
118 for(i = touchRange.first; i != touchRange.second; ++i)
120 int node = (*i).second->getNode();
125 for(
unsigned int d = 0;d<
Dim;++d)
127 dom[d] =
PRegion<T>(dom[d].first() - onoff[d]*offset[d],
128 dom[d].last() - onoff[d]*offset[d]);
129 tmpoffset[d] = onoff[d]*offset[d];
132 regions[node].push_back(std::make_pair(dom,tmpoffset));
141 if((onoff[j] = !onoff[j]))
160 typedef typename std::map<unsigned, std::list<std::pair<NDRegion<T,Dim>,
Offset_t> > >
::iterator m_iterator;
163 PData.ghostDestroy(PData.getGhostNum(), 0);
169 std::vector<MPI_Request> requests;
170 std::vector<MsgBuffer*> buffers;
178 std::vector<size_t> sendlist;
179 std::vector<Offset_t> offsetlist;
184 for (
unsigned int i = 0;i < PData.getLocalNum();++i)
187 for (
unsigned int d = 0;d <
Dim;++d)
193 sendlist.push_back(i);
194 offsetlist.push_back((*li).second);
204 requests.push_back(
Ippl::Comm->raw_isend(0, 0, node, tag));
210 PData.writeMsgBufferWithOffsets(msgbuf, sendlist,offsetlist);
213 requests.push_back(request);
214 buffers.push_back(msgbuf);
221 Format *format = PData.getFormat();
230 MsgBuffer recvbuf(format, buffer, bufsize);
231 PData.readGhostMsgBuffer(&recvbuf, node);
236 MPI_Waitall(requests.size(), &(requests[0]), MPI_STATUSES_IGNORE);
237 for (
unsigned int j = 0; j<buffers.size(); ++j)
239 delete buffers[j]->getFormat();
void updateGhostParticles(IpplParticleBase< ParticleSpatialLayout< T, Dim, Mesh, C > > &PData, ParticleSpatialLayout< T, Dim, Mesh, C > &)
T ParticlePeriodicBCond(const T t, const T minval, const T maxval)
RegionLayout< T, Dim, Mesh > & getLayout()
const NDRegion< T, Dim > & getDomain() const
virtual MPI_Request raw_isend(void *, int, int, int)
virtual int raw_probe_receive(char *&, int &, int &)
void setCacheDimension(int d, T length)
int next_tag(int t, int s=1000)
BoxParticleCachingPolicy()
void updateCacheInformation(ParticleSpatialLayout< T, Dim, Mesh, C > &PLayout)
bool touches(const NDRegion< T, Dim > &nr) const
#define P_SPATIAL_GHOST_TAG
std::map< unsigned, std::list< std::pair< NDRegion< T, Dim >, Offset_t > > > regions
ParticleBConds< T, Dim > & getBConds()
bool getUpdateFlag(UpdateFlags f) const
touch_range_dv touch_range_rdv(const NDRegion< T, Dim > &domain)
T operator[](int i) const
std::string::iterator iterator
static Communicate * Comm
void setAllCacheDimensions(T length)
~BoxParticleCachingPolicy()