19 #ifdef __INTEL_COMPILER
71 int nx_global,ny_global,nz_global;
72 nx_global=lrint((max[0]-min[0])/range);
73 ny_global=lrint((max[1]-min[1])/range);
74 nz_global=lrint((max[2]-min[2])/range);
75 if ((fabs((
double(nx_global)-(max[0]-min[0])/range)) > 1e-6) ||
76 (fabs((
double(ny_global)-(max[1]-min[1])/range)) > 1e-6) ||
77 (fabs((
double(nz_global)-(max[2]-min[2])/range)) > 1e-6)){
79 std::stringstream msg;
80 msg <<
"size doesn't fit range" << endl;
81 msg <<
"diff x : " << double(nx_global)-(max[0]-min[0])/range << endl;
82 msg <<
"diff y : " << double(ny_global)-(max[1]-min[1])/range << endl;
83 msg <<
"diff z : " << double(nz_global)-(max[2]-min[2])/range << endl;
85 throw std::runtime_error(msg.str());
92 int nx=(((nx_global*(pcoords[0]+1))/
m_comm.
get_dim(0))-nx_min)+1;
93 int ny=(((ny_global*(pcoords[1]+1))/
m_comm.
get_dim(1))-ny_min)+1;
94 int nz=(((nz_global*(pcoords[2]+1))/
m_comm.
get_dim(2))-nz_min)+1;
130 int nx_global,ny_global,nz_global;
131 nx_global=lrint((max[0]-min[0])/range);
132 ny_global=lrint((max[1]-min[1])/range);
133 nz_global=lrint((max[2]-min[2])/range);
134 if ((fabs((
double(nx_global)-(max[0]-min[0])/range)) > 1e-6) ||
135 (fabs((
double(ny_global)-(max[1]-min[1])/range)) > 1e-6) ||
136 (fabs((
double(nz_global)-(max[2]-min[2])/range)) > 1e-6)){
138 std::stringstream msg;
139 msg <<
"size doesn't fit range" << endl;
140 msg <<
"diff x : " << double(nx_global)-(max[0]-min[0])/range << endl;
141 msg <<
"diff y : " << double(ny_global)-(max[1]-min[1])/range << endl;
142 msg <<
"diff z : " << double(nz_global)-(max[2]-min[2])/range << endl;
143 throw std::runtime_error(msg.str());
150 int nx=(((nx_global*(pcoords[0]+1))/
m_comm.
get_dim(0))-nx_min)+1;
151 int ny=(((ny_global*(pcoords[1]+1))/
m_comm.
get_dim(1))-ny_min)+1;
152 int nz=(((nz_global*(pcoords[2]+1))/
m_comm.
get_dim(2))-nz_min)+1;
173 if(m_nt!=
NULL)
delete m_nt;
195 for(
typename vector<T>::const_iterator
iter=vp.begin();
210 return m_nt->isInInner(pos);
222 return m_nt->ptr_by_id(
id);
234 return m_nt->getNearestPtr(pos);
246 vector<int> pcoords=m_comm.get_coords();
256 bool circ_edge=
false;
259 if(m_comm.get_dim(0)>1){
261 NTSlab<T> up_boundary_slab=m_nt->yz_slab(m_nt->xsize()-1);
262 up_boundary_slab.
erase(up_boundary_slab.
begin(),up_boundary_slab.
end());
263 NTSlab<T> down_boundary_slab=m_nt->yz_slab(0);
264 down_boundary_slab.
erase(down_boundary_slab.
begin(),down_boundary_slab.
end());
270 up_slab=m_nt->yz_slab(m_nt->xsize()-2);
271 down_slab=m_nt->yz_slab(1);
274 if(m_circ_edge_x_up){
281 buffer.push_back(*
iter);
284 for(
typename vector<T>::iterator
iter=buffer.begin();
287 iter->setCircular(
Vec3(-1.0*m_xshift,0.0,0.0));
289 m_comm.shift_cont_packed(buffer,*m_nt,0,1,m_exchg_tag);
291 m_comm.shift_cont_packed(up_slab,*m_nt,0,1,m_exchg_tag);
294 if(m_circ_edge_x_down){
301 buffer.push_back(*
iter);
304 for(
typename vector<T>::iterator
iter=buffer.begin();
307 iter->setCircular(
Vec3(m_xshift,0.0,0.0));
309 m_comm.shift_cont_packed(buffer,*m_nt,0,-1,m_exchg_tag);
311 m_comm.shift_cont_packed(down_slab,*m_nt,0,-1,m_exchg_tag);
315 if(m_comm.get_dim(1)>1){
317 NTSlab<T> up_boundary_slab=m_nt->xz_slab(m_nt->ysize()-1);
318 up_boundary_slab.
erase(up_boundary_slab.
begin(),up_boundary_slab.
end());
319 NTSlab<T> down_boundary_slab=m_nt->xz_slab(0);
320 down_boundary_slab.
erase(down_boundary_slab.
begin(),down_boundary_slab.
end());
326 up_slab=m_nt->xz_slab(m_nt->ysize()-2);
327 down_slab=m_nt->xz_slab(1);
330 m_comm.shift_cont_packed(up_slab,*m_nt,1,1,m_exchg_tag);
332 m_comm.shift_cont_packed(down_slab,*m_nt,1,-1,m_exchg_tag);
334 cout <<
"circular y shift not implemented" << endl;
338 if(m_comm.get_dim(2)>1){
341 NTSlab<T> up_boundary_slab=m_nt->xy_slab(m_nt->zsize()-1);
342 up_boundary_slab.
erase(up_boundary_slab.
begin(),up_boundary_slab.
end());
343 NTSlab<T> down_boundary_slab=m_nt->xy_slab(0);
344 down_boundary_slab.
erase(down_boundary_slab.
begin(),down_boundary_slab.
end());
347 up_slab=m_nt->xy_slab(m_nt->zsize()-2);
348 down_slab=m_nt->xy_slab(1);
351 m_comm.shift_cont_packed(up_slab,*m_nt,2,1,m_exchg_tag);
353 m_comm.shift_cont_packed(down_slab,*m_nt,2,-1,m_exchg_tag);
355 cout <<
"circular x shift not implemented" << endl;
376 if(m_comm.get_dim(0)>1){
379 exchange_single(rdf,wrtf,m_nt->yz_slab(m_nt->xsize()-2),m_nt->yz_slab(0),0,1);
381 exchange_single(rdf,wrtf,m_nt->yz_slab(1),m_nt->yz_slab(m_nt->xsize()-1),0,-1);
384 if(m_comm.get_dim(1)>1){
387 exchange_single(rdf,wrtf,m_nt->xz_slab(m_nt->ysize()-2),m_nt->xz_slab(0),1,1);
389 exchange_single(rdf,wrtf,m_nt->xz_slab(1),m_nt->xz_slab(m_nt->ysize()-1),1,-1);
392 if(m_comm.get_dim(2)>1){
395 exchange_single(rdf,wrtf,m_nt->xy_slab(m_nt->zsize()-2),m_nt->xy_slab(0),2,1);
397 exchange_single(rdf,wrtf,m_nt->xy_slab(1),m_nt->xy_slab(m_nt->zsize()-1),2,-1);
424 send_data.push_back(((*iter).*rdf)());
428 m_comm.shift_cont_packed(send_data,recv_data,dir,dist,m_exchg_tag);
432 if(recv_data.size()==recv_slab.
size()){
437 ((*iter).*wrtf)(recv_data[count]);
442 cerr <<
"rank = " << m_comm.rank() <<
":ParallelParticleArray<T>::exchange_single ERROR: size mismatch in received data, recv_data.size()!=recv_slab.size() - (" << recv_data.size() <<
"!=" << recv_slab.
size() <<
"). dir = " << dir <<
", dist = " << dist << endl;
458 T* pp=m_nt->ptr_by_id(
id);
478 T* pp=m_nt->ptr_by_id(
id);
496 if(
iter->getTag()==tag){
516 if(
iter->getTag()==tag){
537 if((
iter->getTag() & mask) == (tag & mask)){
560 if((
iter->getTag() & mask) == (tag & mask)){
647 cont.push_back(((*iter).*rdf)());
655 : m_ntBlock(ntBlock),
656 m_it(m_ntBlock.begin())
665 return (m_numRemaining > 0);
680 return m_numRemaining;
704 cont.push_back(((*iter).*rdf)());
715 template <
typename P>
718 vector<pair<int,P> > res;
723 res.push_back(make_pair(
iter->getID(),((*iter).*rdf)()));
736 template <
typename P>
739 vector<pair<int,P> > res;
745 res.push_back(make_pair(
iter->getID(),((*iter).*rdf)()));
773 if((
iter->getTag() | mask )==(tag | mask)){
774 cont.push_back(((*iter).*rdf)());
796 int ptag=
iter->getTag();
797 if((ptag & mask )==(tag & mask)){
798 cont.push_back(((*iter).*rdf)());
812 template <
typename P>
815 vector<pair<int,P> > res;
820 int id=
iter->getID();
821 int ptag=
iter->getTag();
822 if(( ptag & mask )==(tag & mask)){
823 res.push_back(make_pair(
id,((*iter).*rdf)()));
840 template <
typename P>
843 vector<pair<int,P> > res;
849 int id=
iter->getID();
850 int ptag=
iter->getTag();
851 if((ptag & mask )==(tag & mask)){
852 res.push_back(make_pair(
id,((*iter).*rdf)()));
874 template <
typename P>
876 double dx,
double dy,
double dz,
int nx,
int ny,
int nz)
883 for(
int ix=0;ix<nx;ix++){
884 for(
int iy=0;iy<ny;iy++){
885 for(
int iz=0;iz<nz;iz++){
886 Vec3 p=orig+double(ix)*dx*u_x+double(iy)*dy*u_y+double(iz)*dz*u_z;
887 cont.push_back(((*(
m_nt->getNearestPtr(p))).*rdf)());
910 slab=
m_nt->yz_slab(
m_nt->xsize()-1);
911 slab2=
m_nt->yz_slab(
m_nt->xsize()-2);
913 slab=
m_nt->yz_slab(0);
914 slab2=
m_nt->yz_slab(1);
919 slab=
m_nt->xz_slab(
m_nt->ysize()-1);
920 slab2=
m_nt->xz_slab(
m_nt->ysize()-2);
922 slab=
m_nt->xz_slab(0);
923 slab2=
m_nt->xz_slab(1);
928 slab=
m_nt->xy_slab(
m_nt->zsize()-1);
929 slab2=
m_nt->xy_slab(
m_nt->zsize()-2);
931 slab=
m_nt->xy_slab(0);
932 slab2=
m_nt->xy_slab(1);
936 cout <<
"Error: wrong direction " << dir <<
" in getBoundarySlabIds" << endl;
942 res.insert(
iter->getID());
947 res.insert(
iter->getID());
968 slab=
m_nt->yz_slab(
m_nt->xsize()-2);
970 slab=
m_nt->yz_slab(1);
975 slab=
m_nt->xz_slab(
m_nt->ysize()-2);
977 slab=
m_nt->xz_slab(1);
982 slab=
m_nt->xy_slab(
m_nt->zsize()-2);
984 slab=
m_nt->xy_slab(1);
988 cout <<
"Error: wrong direction " << dir <<
" in get2ndSlabIds" << endl;
994 res.insert(
iter->getID());
1005 template<
typename T>
1012 pv.push_back(*
iter);
1022 template<
typename T>
1025 console.
Debug() <<
"ParallelParticleArray<T>::saveCheckPointData\n";
1028 ost <<
m_nt->base_point() <<
"\n";
1029 ost <<
m_nt->base_idx_x() <<
" " <<
m_nt->base_idx_y() <<
" " <<
m_nt->base_idx_z() <<
"\n";
1039 iter->saveCheckPointData(ost);
1049 template<
typename T>
1052 console.
Debug() <<
"ParallelParticleArray<T>::loadCheckPointData\n";
1063 if((bp!=
m_nt->base_point()) ||
1064 (bix!=
m_nt->base_idx_x()) ||
1065 (biy!=
m_nt->base_idx_y()) ||
1066 (biz!=
m_nt->base_idx_z())){
1067 std::cerr <<
"local area data inconsistet: bp " << bp <<
" / " <<
m_nt->base_point()
1068 <<
" bix: " << bix <<
" / " <<
m_nt->base_idx_x()
1069 <<
" biy: " << biy <<
" / " <<
m_nt->base_idx_y()
1070 <<
" bix: " << biz <<
" / " <<
m_nt->base_idx_z() << std::endl;
1077 for(
int i=0;i!=nparts;i++){
1079 p.loadCheckPointData(ist);
1080 if(!
isInInner(p.getPos())) std::cerr <<
"not in inner: " << p.getPos() << std::endl;
1092 template<
typename T>
1093 ostream& operator<<(ostream& ost, const ParallelParticleArray<T> &ppa)
1095 ost <<
"--ParallelParticleArray--" << endl;
1096 ost << *(ppa.m_nt) << endl;
void rebuild()
Definition: pp_array.hpp:242
ParallelParticleArray(TML_Comm *comm, const vector< unsigned int > &dims, const Vec3 &min, const Vec3 &max, double rmax, double alpha)
Definition: pp_array.hpp:62
NtBlock m_ntBlock
Definition: pp_array.h:159
int m_numRemaining
Definition: pp_array.h:161
vector< int > get_coords(int)
get coords of a process
Definition: cart_comm.cpp:159
iterator for a NTSlab
Definition: ntable.h:60
virtual bool isInInner(const Vec3 &)
Definition: pp_array.hpp:208
int getNumRemaining() const
Definition: pp_array.hpp:678
void forParticle(int, void(T::*rdf)())
Definition: pp_array.hpp:456
void exchange_single(P(T::*rdf)(), void(T::*wrtf)(const P &), NTSlab< T >, NTSlab< T >, int, int)
Definition: pp_array.hpp:413
vector< pair< int, P > > forAllInnerParticlesGetIndexed(P(T::*rdf)() const)
Definition: pp_array.hpp:737
~ParallelParticleArray()
Definition: pp_array.hpp:171
boost::python::object iter(const boost::python::object &pyOb)
Definition: Util.h:25
unsigned int size() const
Definition: nt_slab.hpp:38
iterator end()
Definition: nt_slab.hpp:76
iterator begin()
Definition: nt_block.hpp:73
void getAllInnerParticles(vector< T > &)
get all particles in inner block and put them into a vector
Definition: pp_array.hpp:1006
BasicCon & Error(bool h=true)
set verbose level of next message to "err"
Definition: console.cpp:261
representation of a slab of the search array of a NeigborTable
Definition: nt_block.h:22
void forAllInnerParticlesGet(P &, typename P::value_type(T::*rdf)() const)
Definition: pp_array.hpp:698
bool m_circ_edge_x_down
circular edge flags
Definition: pp_array.h:86
bool m_circ_edge_x_up
Definition: pp_array.h:86
void forAllInnerParticles(void(T::*rdf)(P &), P &)
Definition: pp_array.hpp:617
bool hasNext() const
Definition: pp_array.hpp:663
parrallel particle storage array with neighborsearch and variable exchange
Definition: SubLattice.h:61
ParticleIterator getInnerParticleIterator()
Definition: pp_array.hpp:684
unsigned int size()
Definition: nt_block.hpp:56
void forAllTaggedInnerParticlesGet(P &, typename P::value_type(T::*rdf)() const, int, int)
Definition: pp_array.hpp:790
void forParticleTagMask(int, int, void(T::*rdf)())
Definition: pp_array.hpp:532
void forAllTaggedParticlesGet(P &, typename P::value_type(T::*rdf)() const, int, int)
Definition: pp_array.hpp:768
iterator end()
Definition: nt_block.hpp:107
virtual set< int > get2ndSlabIds(int, int) const
Definition: pp_array.hpp:960
ParticleIterator(const NtBlock &ntBlock)
Definition: pp_array.hpp:652
Con console & cout
Definition: console.cpp:30
void exchange(P(T::*rdf)(), void(T::*wrtf)(const P &))
Definition: pp_array.hpp:373
T * getParticlePtrByIndex(int)
Definition: pp_array.hpp:220
Particle & next()
Definition: pp_array.hpp:669
list< T >::iterator iterator
Definition: ntable.h:80
void forAllParticlesGet(P &, typename P::value_type(T::*rdf)() const)
Definition: pp_array.hpp:642
int m_timestamp
Definition: pp_array.h:45
#define NULL
Definition: t_list.h:17
class for neighbor search
Definition: ntable.h:67
abstract base class for communicator
Definition: comm.h:46
vector< pair< int, P > > forAllParticlesGetIndexed(P(T::*rdf)() const)
Definition: pp_array.hpp:716
void saveCheckPointData(std::ostream &)
Definition: pp_array.hpp:1023
T * getParticlePtrByPosition(const Vec3 &)
Definition: pp_array.hpp:232
representation of a slab of the search array of a NeigborTable
Definition: nt_slab.h:23
double m_zshift
circular shift values
Definition: pp_array.h:85
NeighborTable< T > * m_nt
Definition: pp_array.h:83
BasicCon & Debug(bool h=true)
set verbose level of next message to "dbg"
Definition: console.cpp:305
void insert(const T &)
particle insertion
Definition: pp_array.hpp:182
virtual set< int > getBoundarySlabIds(int, int) const
Definition: pp_array.hpp:902
iterator for a NTBlock
Definition: ntb_iter.h:33
vector< pair< int, P > > forAllTaggedParticlesGetIndexed(P(T::*rdf)() const, int, int)
Definition: pp_array.hpp:813
abstract base class for parallel particle storage array
Definition: pp_array.h:41
Definition: pp_array.h:143
void forAllParticles(void(T::*rdf)())
Definition: pp_array.hpp:570
TML_CartComm m_comm
Definition: pp_array.h:44
BlockIterator m_it
Definition: pp_array.h:160
void forPointsGetNearest(P &, typename P::value_type(T::*rdf)() const, const Vec3 &, double, double, double, int, int, int)
Definition: pp_array.hpp:875
void forParticleTag(int, void(T::*rdf)())
Definition: pp_array.hpp:491
int getInnerSize()
Definition: pp_array.h:105
double m_yshift
Definition: pp_array.h:85
T Particle
Definition: pp_array.h:147
double m_xshift
Definition: pp_array.h:85
vector< pair< int, P > > forAllInnerTaggedParticlesGetIndexed(P(T::*rdf)() const, int, int)
Definition: pp_array.hpp:841
int get_dim(int)
get size of communicator in one direction
Definition: cart_comm.cpp:205
void loadCheckPointData(std::istream &)
Definition: pp_array.hpp:1050
iterator begin()
Definition: nt_slab.hpp:54