19 #ifdef __INTEL_COMPILER
68 vector<int> pcoords=m_comm.get_coords();
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());
88 int nx_min=((nx_global*pcoords[0])/m_comm.get_dim(0))-1;
89 int ny_min=((ny_global*pcoords[1])/m_comm.get_dim(1))-1;
90 int nz_min=((nz_global*pcoords[2])/m_comm.get_dim(2))-1;
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;
127 vector<int> pcoords=m_comm.get_coords();
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());
146 int nx_min=((nx_global*pcoords[0])/m_comm.get_dim(0))-1;
147 int ny_min=((ny_global*pcoords[1])/m_comm.get_dim(1))-1;
148 int nz_min=((nz_global*pcoords[2])/m_comm.get_dim(2))-1;
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;
161 m_circ_edge_x_up=(circ[0] && (pcoords[0]==m_comm.get_dim(0)-1)) ? true : false ;
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>
1095 ost <<
"--ParallelParticleArray--" << endl;
1096 ost << *(ppa.
m_nt) << endl;