56 const Vec3& p0_global,
61 : m_p0_global(p0_global),
97 m_array[
iter].erase(m_array[
iter].begin(),m_array[
iter].end());
112 int ix=int(floor((pos.
X()-m_p0_global.X())/m_dim))-m_global_idx;
113 int iy=int(floor((pos.
Y()-m_p0_global.Y())/m_dim))-m_global_idy;
114 int iz=int(floor((pos.
Z()-m_p0_global.Z())/m_dim))-m_global_idz;
115 if((ix>=0)&&(ix<m_xsize)&&
116 (iy>=0)&&(iy<m_ysize)&&
117 (iz>=0)&&(iz<m_zsize)){
118 idx=m_ysize*m_zsize*ix+m_zsize*iy+iz;
135 return m_ysize*m_zsize*x+m_zsize*y+z;
148 int ix=int(floor((pos.
X()-m_p0_global.X())/m_dim))-m_global_idx;
149 int iy=int(floor((pos.
Y()-m_p0_global.Y())/m_dim))-m_global_idy;
150 int iz=int(floor((pos.
Z()-m_p0_global.Z())/m_dim))-m_global_idz;
153 res=((ix>0) && (ix<m_xsize-1) && (iy>0) && (iy<m_ysize-1));
155 res=((ix>0) && (ix<m_xsize-1) && (iy>0) && (iy<m_ysize-1)&& (iz>0) && (iz<m_zsize-1));
171 typename list<T>::iterator
iter=m_list.insert(m_list.end(),t);
173 int idx=index(
iter->getPos());
176 m_idParticleMap.insert(make_pair(
iter->getID(),&(*
iter)));
177 m_array[idx].push_back(
iter);
179 typename list<T>::iterator h=
iter;
192 clear_search_array();
194 m_idParticleMap.clear();
195 for(
typename list<T>::iterator
iter=m_list.begin();
198 int idx=index(
iter->getPos());
199 int id=
iter->getID();
201 m_array[idx].push_back(
iter);
202 m_idParticleMap[id]=&(*iter);
204 typename list<T>::iterator h=
iter;
218 return &(*(m_array[idx.first][idx.second]));
227 return *(m_array[idx.first][idx.second]);
240 typename IdParticleMap::iterator it = m_idParticleMap.find(
id);
242 if (it != m_idParticleMap.end()) {
243 pParticle = it->second;
247 if(
id!=pParticle->getID()){
248 console.
Debug() <<
"inconsistent idParticleMap: " <<
id <<
" vs. " << pParticle->getID() <<
"\n";
268 double dist=3.0*(m_dim*m_dim);
270 for(
typename pointtype::iterator
iter=m_array[idx].begin();
271 iter!=m_array[idx].end();
273 double ndist=(pos-(*iter)->getPos()).norm2();
274 res=(ndist<dist) ? &(**
iter) : res;
275 dist=(ndist<dist) ? ndist : dist;
288 m_idParticleMap.erase(m_array[idx.first][idx.second]->getID());
289 m_list.erase(m_array[idx.first][idx.second]);
290 m_array[idx.first].erase(m_array[idx.first].begin()+idx.second);
301 return NTSlab<T>(
this,
DSlice(z,m_ysize,m_zsize,m_xsize,m_ysize*m_zsize));
312 return NTSlab<T>(
this,
DSlice(y*m_zsize,m_zsize,1,m_xsize,m_ysize*m_zsize));
323 return NTSlab<T>(
this,
DSlice(x*m_ysize*m_zsize,m_zsize,1,m_ysize,m_zsize));
339 return NTBlock<T>(
this,xmin,xmax,ymin,ymax,zmin,zmax);
352 int xmin=int(floor((vmin.
X()-m_p0_global.X())/m_dim))-m_global_idx;
353 int ymin=int(floor((vmin.
Y()-m_p0_global.Y())/m_dim))-m_global_idy;
354 int zmin=int(floor((vmin.
Z()-m_p0_global.Z())/m_dim))-m_global_idz;
356 xmin=(xmin < 0) ? 0 : xmin;
357 ymin=(ymin < 0) ? 0 : ymin;
358 zmin=(zmin < 0) ? 0 : zmin;
361 int xmax=int(floor((vmax.
X()-m_p0_global.X())/m_dim))-m_global_idx;
362 int ymax=int(floor((vmax.
Y()-m_p0_global.Y())/m_dim))-m_global_idy;
363 int zmax=int(floor((vmax.
Z()-m_p0_global.Z())/m_dim))-m_global_idz;
365 xmax=(xmax < m_xsize) ? xmax : m_xsize-1;
366 ymax=(ymax < m_ysize) ? ymax : m_ysize-1;
367 zmax=(zmax < m_zsize) ? zmax : m_zsize-1;
369 return NTBlock<T>(
this,xmin,xmax,ymin,ymax,zmin,zmax);
380 return NTBlock<T>(
this,1,m_xsize-2,1,m_ysize-2,1,m_zsize-2);
396 for(
typename pointtype::iterator
iter=m_array[idx1].begin();
397 iter!=m_array[idx1].end();
399 for(
typename pointtype::iterator iter2=m_array[idx2].begin();
400 iter2!=m_array[idx2].end();
402 double dist2=((*iter)->getPos()-(*iter2)->getPos()).norm2();
403 double dmax=(*iter)->getRad()+(*iter2)->getRad()+m_alpha;
404 if(dist2<=(dmax*dmax)){
405 if((*iter)->getID()<(*iter2)->getID()){
406 list->push_back(make_pair(&(**
iter),&(**iter2)));
408 list->push_back(make_pair(&(**iter2),&(**
iter)));
424 if(m_array[idx].size()>=2){
425 for(
typename pointtype::iterator
iter=m_array[idx].begin();
426 iter!=m_array[idx].end()-1;
428 for(
typename pointtype::iterator iter2=
iter+1;
429 iter2!=m_array[idx].end();
431 double dist2=((*iter)->getPos()-(*iter2)->getPos()).norm2();
432 double dmax=(*iter)->getRad()+(*iter2)->getRad()+m_alpha;
433 if(dist2<=(dmax*dmax)){
434 if((*iter)->getID()<(*iter2)->getID()){
435 list->push_back(make_pair(&(**
iter),&(**iter2)));
437 list->push_back(make_pair(&(**iter2),&(**
iter)));
457 for(
typename pointtype::iterator
iter=m_array[idx1].begin();
458 iter!=m_array[idx1].end();
460 if((*iter)->isFlagged()){
461 for(
typename pointtype::iterator iter2=m_array[idx2].begin();
462 iter2!=m_array[idx2].end();
464 if((*iter2)->isFlagged()){
465 if((*iter)->getID()<(*iter2)->getID()){
466 list->push_back(make_pair(&(**
iter),&(**iter2)));
468 list->push_back(make_pair(&(**iter2),&(**
iter)));
486 if(m_array[idx].size()>=2){
487 for(
typename pointtype::iterator
iter=m_array[idx].begin();
488 iter!=m_array[idx].end()-1;
490 if((*iter)->isFlagged()){
491 for(
typename pointtype::iterator iter2=
iter+1;
492 iter2!=m_array[idx].end();
494 if((*iter2)->isFlagged()){
495 if((*iter)->getID()<(*iter2)->getID()){
496 list->push_back(make_pair(&(**
iter),&(**iter2)));
498 list->push_back(make_pair(&(**iter2),&(**
iter)));
516 for(
int ix=0;ix<m_xsize;ix++){
517 for(
int iy=0;iy<m_ysize;iy++){
518 for(
int iz=0;iz<m_zsize;iz++){
520 addPairsToListLocal(list,index(ix,iy,iz));
522 int xmax=(ix<m_xsize-1) ? ix+1 : ix;
523 int ymax=(iy<m_ysize-1) ? iy+1 : iy;
524 int zmax=(iz<m_zsize-1) ? iz+1 : iz;
525 int xmin=(ix>0) ? ix-1 : ix;
526 int ymin=(iy>0) ? iy-1 : iy;
527 int zmin=(iz>0) ? iz-1 : iz;
528 for(
int i=xmin;i<=xmax;i++){
529 for(
int j=ymin;j<=ymax;j++){
530 for(
int k=zmin;k<=zmax;k++){
531 int idx1=index(ix,iy,iz);
532 int idx2=index(i,j,k);
534 addPairsToList(list,idx1,idx2);
554 for(
int ix=0;ix<m_xsize;ix++){
555 for(
int iy=0;iy<m_ysize;iy++){
556 for(
int iz=0;iz<m_zsize;iz++){
558 addPairsToListLocalFlagged(nlist,index(ix,iy,iz));
560 int xmax=(ix<m_xsize-1) ? ix+1 : ix;
561 int ymax=(iy<m_ysize-1) ? iy+1 : iy;
562 int zmax=(iz<m_zsize-1) ? iz+1 : iz;
563 int xmin=(ix>0) ? ix-1 : ix;
564 int ymin=(iy>0) ? iy-1 : iy;
565 int zmin=(iz>0) ? iz-1 : iz;
566 for(
int i=xmin;i<=xmax;i++){
567 for(
int j=ymin;j<=ymax;j++){
568 for(
int k=zmin;k<=zmax;k++){
569 int idx1=index(ix,iy,iz);
570 int idx2=index(i,j,k);
572 addPairsToListFlagged(nlist,idx1,idx2);
580 for(
typename list<T>::iterator
iter=m_list.begin();
583 iter->setFlag(
false);
600 console.
Debug() <<
"NeighborTable<T>::getParticlesAtPlane: m_dim = " << m_dim <<
"\n";
601 for(
typename list<T>::iterator
iter=m_list.begin();
604 double dist=(
iter->getPos()-orig)*normal;
605 if(fabs(dist)<m_dim){
606 nlist->push_back(&(*
iter));
609 console.
Debug() <<
"NeighborTable<T>::getParticlesAtPlane: found = " << nlist->size() <<
"particles\n";
626 console.
Debug() <<
"NeighborTable<T>::getParticlesNearSphere: m_dim = " << m_dim <<
"\n";
627 for(
typename list<T>::iterator
iter=m_list.begin();
630 double dist=(
iter->getPos()-centre).norm() - radius;
631 if(fabs(dist)<m_dim){
632 nlist->push_back(&(*
iter));
635 console.
Debug() <<
"NeighborTable<T>::getParticlesNearSphere: found = " << nlist->size() <<
"particles\n";
655 if((v_min.
X()<m_max_corner.X())&&(v_min.
Y()<m_max_corner.Y())&&(v_min.
Z()<m_max_corner.Z())&&
656 (v_max.
X()>m_min_corner.X())&&(v_max.
Y()>m_min_corner.Y())&&(v_max.
Z()>m_min_corner.Z())){
662 if(Tr.
sep(
iter->getPos()) <
iter->getRad()+m_alpha){
663 nlist->push_back(&(*
iter));
686 if((v_min.
X()<m_max_corner.X())&&(v_min.
Y()<m_max_corner.Y())&&(v_min.
Z()<m_max_corner.Z())&&
687 (v_max.
X()>m_min_corner.X())&&(v_max.
Y()>m_min_corner.Y())&&(v_max.
Z()>m_min_corner.Z())){
694 if(E->
sep(
iter->getPos()) <
iter->getRad()+m_alpha){
695 nlist->push_back(&(*
iter));
714 Vec3 v_min=p-
Vec3(m_dim,m_dim,m_dim);
715 Vec3 v_max=p+
Vec3(m_dim,m_dim,m_dim);
717 if((v_min.
X()<m_max_corner.X())&&(v_min.
Y()<m_max_corner.Y())&&(v_min.
Z()<m_max_corner.Z())&&
718 (v_max.
X()>m_min_corner.X())&&(v_max.
Y()>m_min_corner.Y())&&(v_max.
Z()>m_min_corner.Z())){
725 if((p-
iter->getPos()).norm() <
iter->getRad()+m_alpha){
726 nlist->push_back(&(*
iter));
742 for(
typename list<T>::iterator
iter=m_list.begin();
745 nlist->push_back(&(*
iter));
760 ost <<
"---NeighborTable---" << endl;
761 ost <<
"3d array dimensions (x,y,z),size : (" << NT.
m_xsize <<
"," << NT.
m_ysize<<
"," << NT.
m_zsize <<
"), " << NT.
m_array.size() << endl;
762 ost <<
"search range : " << NT.
m_dim << endl;
763 ost <<
"--list--" << endl;
764 ost << (NT.
m_list).size() <<
" elements" << endl;
765 for(
typename list<T>::const_iterator
iter=(NT.
m_list).begin();
768 ost <<
iter->getID() <<
" " <<
iter->getPos() << endl;
770 ost <<
"---search array---" << endl;
771 for(
int ix=0;ix<NT.
m_xsize;ix++){
772 for(
int iy=0;iy<NT.
m_ysize;iy++){
773 for(
int iz=0;iz<NT.
m_zsize;iz++){
775 int idx=NT.
index(ix,iy,iz);
777 ost <<
"(" << ix <<
"," << iy <<
"," << iz <<
") , [" << idx <<
"], " << np <<
" : ";
778 for(
unsigned int i=0;i<np;i++){
779 ost << (NT.
m_array[idx])[i]->getID() <<
" ";