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";
629 if((v_min.
X()<m_max_corner.X())&&(v_min.
Y()<m_max_corner.Y())&&(v_min.
Z()<m_max_corner.Z())&&
630 (v_max.
X()>m_min_corner.X())&&(v_max.
Y()>m_min_corner.Y())&&(v_max.
Z()>m_min_corner.Z())){
636 if(Tr.
sep(
iter->getPos()) <
iter->getRad()+m_alpha){
637 nlist->push_back(&(*
iter));
660 if((v_min.
X()<m_max_corner.X())&&(v_min.
Y()<m_max_corner.Y())&&(v_min.
Z()<m_max_corner.Z())&&
661 (v_max.
X()>m_min_corner.X())&&(v_max.
Y()>m_min_corner.Y())&&(v_max.
Z()>m_min_corner.Z())){
668 if(E->
sep(
iter->getPos()) <
iter->getRad()+m_alpha){
669 nlist->push_back(&(*
iter));
688 Vec3 v_min=p-
Vec3(m_dim,m_dim,m_dim);
689 Vec3 v_max=p+Vec3(m_dim,m_dim,m_dim);
691 if((v_min.
X()<m_max_corner.X())&&(v_min.
Y()<m_max_corner.Y())&&(v_min.
Z()<m_max_corner.Z())&&
692 (v_max.
X()>m_min_corner.X())&&(v_max.
Y()>m_min_corner.Y())&&(v_max.
Z()>m_min_corner.Z())){
699 if((p-
iter->getPos()).norm() <
iter->getRad()+m_alpha){
700 nlist->push_back(&(*
iter));
716 for(
typename list<T>::iterator
iter=m_list.begin();
719 nlist->push_back(&(*
iter));
732 std::ostream& operator<<(std::ostream& ost, const NeighborTable<T>& NT)
734 ost <<
"---NeighborTable---" << endl;
735 ost <<
"3d array dimensions (x,y,z),size : (" << NT.m_xsize <<
"," << NT.m_ysize<<
"," << NT.m_zsize <<
"), " << NT.m_array.size() << endl;
736 ost <<
"search range : " << NT.m_dim << endl;
737 ost <<
"--list--" << endl;
738 ost << (NT.m_list).size() <<
" elements" << endl;
739 for(
typename list<T>::const_iterator
iter=(NT.m_list).begin();
740 iter!=(NT.m_list).end();
742 ost <<
iter->getID() <<
" " <<
iter->getPos() << endl;
744 ost <<
"---search array---" << endl;
745 for(
int ix=0;ix<NT.m_xsize;ix++){
746 for(
int iy=0;iy<NT.m_ysize;iy++){
747 for(
int iz=0;iz<NT.m_zsize;iz++){
748 unsigned int np=NT.nparts_at_gridpoint(NT.index(ix,iy,iz));
749 int idx=NT.index(ix,iy,iz);
751 ost <<
"(" << ix <<
"," << iy <<
"," << iz <<
") , [" << idx <<
"], " << np <<
" : ";
752 for(
unsigned int i=0;i<np;i++){
753 ost << (NT.m_array[idx])[i]->getID() <<
" ";
void addPairsToListFlagged(T_Handle< pairlist >, int, int)
Definition: ntable.hpp:454
T * ptr_by_id(int)
Definition: ntable.hpp:237
list< pair< T *, T * > > pairlist
Definition: ntable.h:73
T_Handle< particlelist > getParticlesNearEdge(const AEdge *)
Definition: ntable.hpp:652
void addPairsToListLocal(T_Handle< pairlist >, int)
Definition: ntable.hpp:422
T_Handle< particlelist > getParticlesNearTriangle(const Triangle &)
Definition: ntable.hpp:621
T_Handle< particlelist > getParticlesNearPoint(const Vec3 &)
Definition: ntable.hpp:683
VEC3_INLINE double & Z()
Definition: vec3.h:121
int m_xsize
number of grid point, x direction
Definition: ntable.h:93
VEC3_INLINE double & Y()
Definition: vec3.h:120
void addPairsToList(T_Handle< pairlist >, int, int)
Definition: ntable.hpp:393
T * getNearestPtr(const Vec3 &)
Definition: ntable.hpp:261
Vec3 getBoundingBoxMax() const
Definition: Triangle.cpp:170
T_Handle< pairlist > getFullList()
Definition: ntable.hpp:512
boost::python::object iter(const boost::python::object &pyOb)
Definition: Util.h:25
pair< int, int > indextype
Definition: ntable.h:72
arraytype m_array
search array
Definition: ntable.h:85
int m_global_idx
minimum corner index (x component)
Definition: ntable.h:90
iterator begin()
Definition: nt_block.hpp:73
Vec3 m_min_corner
minimum corner of the search array
Definition: ntable.h:97
double sep(const Vec3 &) const
Definition: Triangle.cpp:83
representation of a slab of the search array of a NeigborTable
Definition: nt_block.h:22
~NeighborTable()
Definition: ntable.hpp:86
int index(const Vec3 &)
Definition: ntable.hpp:109
T * ptr(NeighborTable< T >::indextype)
Definition: ntable.hpp:216
iterator end()
Definition: nt_block.hpp:107
double sep(const Vec3 &) const
Definition: AEdge.cpp:51
Vec3 m_p0_global
minimum corner of global search space
Definition: ntable.h:87
void insert(const T &)
particle insertion
Definition: ntable.hpp:168
T_Handle< pairlist > getNewList()
Definition: ntable.hpp:550
bool isInInner(const Vec3 &)
dimensions
Definition: ntable.hpp:144
void build()
STL compat. insert.
Definition: ntable.hpp:190
NTSlab< T > xy_slab(int)
partial access functions
Definition: ntable.hpp:299
int m_global_idz
minimum corner index (z component)
Definition: ntable.h:92
T_Handle< particlelist > getParticlesAtPlane(const Vec3 &, const Vec3 &)
Definition: ntable.hpp:596
void erase(NeighborTable< T >::indextype)
Definition: ntable.hpp:286
#define NULL
Definition: t_list.h:17
NTSlab< T > xz_slab(int)
Definition: ntable.hpp:310
Class representing a Triangle.
Definition: Triangle.h:47
list< T * > particlelist
Definition: ntable.h:74
representation of a slab of the search array of a NeigborTable
Definition: nt_slab.h:23
NeighborTable()
Constructors.
Definition: ntable.hpp:19
Vec3 getBoundingBoxMin() const
Definition: AEdge.cpp:33
int m_global_idy
minimum corner index (y component)
Definition: ntable.h:91
NTSlab< T > yz_slab(int)
Definition: ntable.hpp:321
BasicCon & Debug(bool h=true)
set verbose level of next message to "dbg"
Definition: console.cpp:305
void clear_search_array()
Definition: ntable.hpp:94
int m_zsize
number of grid point, z direction
Definition: ntable.h:95
NTBlock< T > block(int, int, int, int, int, int)
Definition: ntable.hpp:337
iterator for a NTBlock
Definition: ntb_iter.h:33
NTBlock< T > inner()
Definition: ntable.hpp:378
T_Handle< particlelist > getAllParticles()
Definition: ntable.hpp:712
double m_dim
grid spacing of search array
Definition: ntable.h:88
VEC3_INLINE double & X()
Definition: vec3.h:119
Template class for a handle/ref. counted pointer.
Definition: handle.h:26
Vec3 getBoundingBoxMax() const
Definition: AEdge.cpp:41
abstract base class for edges in mesh (2D or 3D)
Definition: AEdge.h:27
T & ref(NeighborTable< T >::indextype)
Definition: ntable.hpp:225
void addPairsToListLocalFlagged(T_Handle< pairlist >, int)
Definition: ntable.hpp:484
int m_ysize
number of grid point, y direction
Definition: ntable.h:94
Vec3 getBoundingBoxMin() const
Definition: Triangle.cpp:159
Vec3 m_max_corner
maximum corner of the search array
Definition: ntable.h:98