Go to the documentation of this file.
14 #ifndef ESYS_LSMNEIGHBOURTABLE_HPP
15 #define ESYS_LSMNEIGHBOURTABLE_HPP
21 template <
class TmplParticle>
28 m_maxIndex(
Vec3L(-1, -1, -1)),
29 m_gridSpacing(gridSpacing),
31 m_insertedParticles(),
37 template <
class TmplParticle>
41 : m_dimensions(nTable.m_dimensions),
42 m_minIndex(nTable.m_minIndex),
43 m_maxIndex(nTable.m_maxIndex),
44 m_gridSpacing(nTable.m_gridSpacing),
45 m_bBox(nTable.m_bBox),
46 m_insertedParticles(nTable.m_insertedParticles),
59 template <
class TmplParticle>
64 template <
class TmplParticle>
67 for (
int i = getMinVecIndex().X(); i <= getMaxVecIndex().X(); i++) {
68 for (
int j = getMinVecIndex().Y(); j <= getMaxVecIndex().Y(); j++) {
69 for (
int k = getMinVecIndex().Z(); k <= getMaxVecIndex().Z(); k++) {
70 m_tablePtr[getScalarIndex(i, j, k)].clear();
74 m_insertedParticles.clear();
77 template <
class TmplParticle>
83 template <
class TmplParticle>
90 clearAndRecomputeGrid(bBox, gridSpacing);
92 typename ParticleVector::iterator it = particles.begin();
93 it != particles.end();
101 template <
class TmplParticle>
108 template <
class TmplParticle>
115 template <
class TmplParticle>
122 template <
class TmplParticle>
125 return m_insertedParticles.size();
128 template <
class TmplParticle>
136 xIdx*m_dimensions.Z()*m_dimensions.Y()
138 yIdx*m_dimensions.Z()
143 template <
class TmplParticle>
146 return getScalarIndex(index.
X(), index.
Y(), index.
Z());
149 template <
class TmplParticle>
153 return getScalarIndex(getVecIndex(pt));
156 template <
class TmplParticle>
163 template <
class TmplParticle>
170 template <
class TmplParticle>
174 const Vec3 relPos =
Vec3((pt - getMinPt())/m_gridSpacing);
175 const Vec3L index =
Vec3L(
int(floor(relPos.
X())),
int(floor(relPos.
Y())),
int(floor(relPos.
Z())));
176 return getMinVecIndex().max(getMaxVecIndex().min(index));
179 template <
class TmplParticle>
187 neighbours.reserve(128);
188 const Vec3L min = getVecIndex(pt - radius);
189 const Vec3L max = getVecIndex(pt + radius);
190 for (
int i = min.
X(); i <= max.
X(); i++) {
191 for (
int j = min.
Y(); j <= max.
Y(); j++) {
192 for (
int k = min.
Z(); k <= max.
Z(); k++) {
195 m_tablePtr[getScalarIndex(i, j, k)].begin(),
196 m_tablePtr[getScalarIndex(i, j, k)].end()
204 template <
class TmplParticle>
212 std::sort(neighbours.begin(), neighbours.end());
213 typename ParticleVector::iterator uniqueEnd =
214 std::unique(neighbours.begin(), neighbours.end());
223 template <
class TmplParticle>
229 return m_tablePtr[getScalarIndex(pt)];
232 template <
class TmplParticle>
235 const Vec3L minIdx = getVecIndex(pParticle->getPos() - pParticle->getRad());
236 const Vec3L maxIdx = getVecIndex(pParticle->getPos() + pParticle->getRad());
237 insertInTable(pParticle, minIdx, maxIdx);
238 addInserted(pParticle);
241 template <
class TmplParticle>
247 template <
class TmplParticle>
254 template <
class TmplParticle>
261 template <
class TmplParticle>
268 for (
int i = minIdx.
X(); i <= maxIdx.
X(); i++) {
269 for (
int j = minIdx.
Y(); j <= maxIdx.
Y(); j++) {
270 for (
int k = minIdx.
Z(); k <= maxIdx.
Z(); k++) {
271 m_tablePtr[getScalarIndex(i, j, k)].push_back(pParticle);
277 template <
class TmplParticle>
280 m_insertedParticles.push_back(pParticle);
283 template <
class TmplParticle>
286 return getDimensions()[0]*getDimensions()[1]*getDimensions()[2];
289 template <
class TmplParticle>
293 return m_insertedParticles;
296 template <
class TmplParticle>
304 m_gridSpacing = gridSpacing;
306 const Vec3 dims = m_bBox.getSizes()/gridSpacing;
313 m_dimensions = m_dimensions.max(
Vec3L(1, 1, 1));
318 m_dimensions.X()*m_dimensions.Y()*m_dimensions.Z()
321 m_minIndex =
Vec3L(0, 0, 0);
322 m_maxIndex = (m_dimensions - 1);
void insert(Particle *pParticle)
Definition: NeighbourTable.hpp:233
NeighbourTable(const BoundingBox &bBox, double gridSpacing)
Definition: NeighbourTable.hpp:22
const Long & Z() const
Definition: Vec3L.h:119
void clearAndRecomputeGrid(const BoundingBox &bBox, double gridSpacing)
Definition: NeighbourTable.hpp:297
const Vec3L & getDimensions() const
Definition: NeighbourTable.hpp:103
TmplParticle Particle
Definition: NeighbourTable.h:35
Definition: NeighbourTable.h:33
const Vec3L & getMaxVecIndex() const
Definition: NeighbourTable.hpp:165
ParticleVectorArrayPtr m_tablePtr
Definition: NeighbourTable.h:111
void insertInTable(Particle *pParticle, const Vec3L &minIdx, const Vec3L &maxIdx)
Definition: NeighbourTable.hpp:262
ParticleVector getNeighbourVector(const Vec3 &pt, double radius) const
Definition: NeighbourTable.hpp:181
const Vec3 & getMinPt() const
Definition: NeighbourTable.hpp:117
ParticleIterator getParticleIterator()
Definition: NeighbourTable.hpp:249
int getScalarIndex(int xIdx, int yIdx, int zIdx) const
Definition: NeighbourTable.hpp:129
void addInserted(Particle *pParticle)
Definition: NeighbourTable.hpp:278
const Long & X() const
Definition: Vec3L.h:99
boost::shared_array< ParticleVector > ParticleVectorArrayPtr
Definition: NeighbourTable.h:103
VEC3_INLINE double & X()
Definition: vec3.h:119
3D bounding box
Definition: BoundingBox.h:28
Definition: CheckPointable.cpp:17
std::vector< Particle * > ParticleVector
Definition: NeighbourTable.h:36
const Vec3L & getMinVecIndex() const
Definition: NeighbourTable.hpp:158
double getGridSpacing() const
Definition: NeighbourTable.hpp:78
VEC3_INLINE double & Z()
Definition: vec3.h:121
void clear()
Definition: NeighbourTable.hpp:65
ParticleVector getInsertedParticles() const
Definition: NeighbourTable.hpp:291
size_t size() const
Definition: NeighbourTable.hpp:123
const Vec3 & getMinPt() const
Definition: BoundingBox.hpp:40
virtual ~NeighbourTable()
Definition: NeighbourTable.hpp:60
VEC3_INLINE double & Y()
Definition: vec3.h:120
int getNumCells() const
Definition: NeighbourTable.hpp:284
Definition: StlIterator.h:30
const Long & Y() const
Definition: Vec3L.h:109
Definition: StlIterator.h:76
void resize(const BoundingBox &bBox, double gridSpacing)
Definition: NeighbourTable.hpp:84
const BoundingBox & getBBox() const
Definition: NeighbourTable.hpp:110
ParticleVector getUniqueNeighbourVector(const Vec3 &pt, double radius) const
Definition: NeighbourTable.hpp:206
BoundingBox getBBox(const std::string &arg)
Definition: Main.cpp:24
Vec3L getVecIndex(const Vec3 &pt) const
Definition: NeighbourTable.hpp:172