void LinkCells::retrieveNeighboringAtoms( const Vector& pos, unsigned& natomsper, std::vector<unsigned>& atoms ) const { plumed_assert( natomsper==1 || natomsper==2 ); // This is really a bug. If you are trying to reuse this ask GAT for help std::vector<unsigned> celn( findMyCell( pos ) ); for(int nx=LINKC_MIN(ncells[0]);nx<LINKC_MAX(ncells[0]);++nx){ int xval = celn[0] + nx; xval=LINKC_PBC(xval,ncells[0])*nstride[0]; for(int ny=LINKC_MIN(ncells[1]);ny<LINKC_MAX(ncells[1]);++ny){ int yval = celn[1] + ny; yval=LINKC_PBC(yval,ncells[1])*nstride[1]; for(int nz=LINKC_MIN(ncells[2]);nz<LINKC_MAX(ncells[2]);++nz){ int zval = celn[2] + nz; zval=LINKC_PBC(zval,ncells[2])*nstride[2]; unsigned mybox=xval+yval+zval; for(unsigned k=0;k<lcell_tots[mybox];++k){ unsigned myatom = lcell_lists[lcell_starts[mybox]+k]; if( myatom!=atoms[0] ){ // Ideally would provide an option to not do this atoms[natomsper]=myatom; natomsper++; } } } } } }
void LinkCells::addRequiredCells( const std::array<unsigned,3>& celn, unsigned& ncells_required, std::vector<unsigned>& cells_required ) const { unsigned nnew_cells=0; for(int nx=LINKC_MIN(ncells[0]); nx<LINKC_MAX(ncells[0]); ++nx) { int xval = celn[0] + nx; xval=LINKC_PBC(xval,ncells[0])*nstride[0]; for(int ny=LINKC_MIN(ncells[1]); ny<LINKC_MAX(ncells[1]); ++ny) { int yval = celn[1] + ny; yval=LINKC_PBC(yval,ncells[1])*nstride[1]; for(int nz=LINKC_MIN(ncells[2]); nz<LINKC_MAX(ncells[2]); ++nz) { int zval = celn[2] + nz; zval=LINKC_PBC(zval,ncells[2])*nstride[2]; unsigned mybox=xval+yval+zval; bool added=false; for(unsigned k=0; k<ncells_required; ++k) { if( mybox==cells_required[k] ) { added=true; break; } } if( !added ) { cells_required[ncells_required+nnew_cells]=mybox; nnew_cells++; } } } } ncells_required += nnew_cells; }