ESyS-Particle  2.3.2
NeighbourTable.hpp
Go to the documentation of this file.
1 
2 // //
3 // Copyright (c) 2003-2014 by The University of Queensland //
4 // Centre for Geoscience Computing //
5 // http://earth.uq.edu.au/centre-geoscience-computing //
6 // //
7 // Primary Business: Brisbane, Queensland, Australia //
8 // Licensed under the Open Software License version 3.0 //
9 // http://www.opensource.org/licenses/osl-3.0.php //
10 // //
12 
13 
14 #ifndef ESYS_LSMNEIGHBOURTABLE_HPP
15 #define ESYS_LSMNEIGHBOURTABLE_HPP
16 
17 namespace esys
18 {
19  namespace lsm
20  {
21  template <class TmplParticle>
23  const BoundingBox &bBox,
24  double gridSpacing
25  )
26  : m_dimensions(),
27  m_minIndex(),
28  m_maxIndex(Vec3L(-1, -1, -1)),
29  m_gridSpacing(gridSpacing),
30  m_bBox(bBox),
31  m_insertedParticles(),
32  m_tablePtr()
33  {
34  resize(bBox, gridSpacing);
35  }
36 
37  template <class TmplParticle>
39  const NeighbourTable &nTable
40  )
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),
47  m_tablePtr()
48  {
49  m_tablePtr =
51  new ParticleVector[nTable.getNumCells()]
52  );
53  for (int i = 0; i < nTable.getNumCells(); i++)
54  {
55  m_tablePtr[i] = nTable.m_tablePtr[i];
56  }
57  }
58 
59  template <class TmplParticle>
61  {
62  }
63 
64  template <class TmplParticle>
66  {
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();
71  }
72  }
73  }
74  m_insertedParticles.clear();
75  }
76 
77  template <class TmplParticle>
79  {
80  return m_gridSpacing;
81  }
82 
83  template <class TmplParticle>
85  const BoundingBox &bBox,
86  double gridSpacing
87  )
88  {
89  ParticleVector particles = getInsertedParticles();
90  clearAndRecomputeGrid(bBox, gridSpacing);
91  for (
92  typename ParticleVector::iterator it = particles.begin();
93  it != particles.end();
94  it++
95  )
96  {
97  insert(*it);
98  }
99  }
100 
101  template <class TmplParticle>
102  const Vec3L &
104  {
105  return m_dimensions;
106  }
107 
108  template <class TmplParticle>
109  const BoundingBox &
111  {
112  return m_bBox;
113  }
114 
115  template <class TmplParticle>
116  const Vec3 &
118  {
119  return getBBox().getMinPt();
120  }
121 
122  template <class TmplParticle>
124  {
125  return m_insertedParticles.size();
126  }
127 
128  template <class TmplParticle>
130  int xIdx,
131  int yIdx,
132  int zIdx
133  ) const
134  {
135  return
136  xIdx*m_dimensions.Z()*m_dimensions.Y()
137  +
138  yIdx*m_dimensions.Z()
139  +
140  zIdx;
141  }
142 
143  template <class TmplParticle>
145  {
146  return getScalarIndex(index.X(), index.Y(), index.Z());
147  }
148 
149  template <class TmplParticle>
150  int
152  {
153  return getScalarIndex(getVecIndex(pt));
154  }
155 
156  template <class TmplParticle>
157  const Vec3L &
159  {
160  return m_minIndex;
161  }
162 
163  template <class TmplParticle>
164  const Vec3L &
166  {
167  return m_maxIndex;
168  }
169 
170  template <class TmplParticle>
171  Vec3L
173  {
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));
177  }
178 
179  template <class TmplParticle>
182  const Vec3 &pt,
183  double radius
184  ) const
185  {
186  ParticleVector neighbours;
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++) {
193  neighbours.insert(
194  neighbours.end(),
195  m_tablePtr[getScalarIndex(i, j, k)].begin(),
196  m_tablePtr[getScalarIndex(i, j, k)].end()
197  );
198  }
199  }
200  }
201  return neighbours;
202  }
203 
204  template <class TmplParticle>
207  const Vec3 &pt,
208  double radius
209  ) const
210  {
211  ParticleVector neighbours = getNeighbourVector(pt, radius);
212  std::sort(neighbours.begin(), neighbours.end());
213  typename ParticleVector::iterator uniqueEnd =
214  std::unique(neighbours.begin(), neighbours.end());
215  neighbours.erase(
216  uniqueEnd,
217  neighbours.end()
218  );
219 
220  return neighbours;
221  }
222 
223  template <class TmplParticle>
226  const Vec3 &pt
227  ) const
228  {
229  return m_tablePtr[getScalarIndex(pt)];
230  }
231 
232  template <class TmplParticle>
234  {
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);
239  }
240 
241  template <class TmplParticle>
243  {
244  insert(&particle);
245  }
246 
247  template <class TmplParticle>
250  {
251  return ParticleIterator(m_insertedParticles);
252  }
253 
254  template <class TmplParticle>
257  {
258  return ParticleConstIterator(m_insertedParticles);
259  }
260 
261  template <class TmplParticle>
263  Particle *pParticle,
264  const Vec3L &minIdx,
265  const Vec3L &maxIdx
266  )
267  {
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);
272  }
273  }
274  }
275  }
276 
277  template <class TmplParticle>
279  {
280  m_insertedParticles.push_back(pParticle);
281  }
282 
283  template <class TmplParticle>
285  {
286  return getDimensions()[0]*getDimensions()[1]*getDimensions()[2];
287  }
288 
289  template <class TmplParticle>
292  {
293  return m_insertedParticles;
294  }
295 
296  template <class TmplParticle>
298  const BoundingBox &bBox,
299  double gridSpacing
300  )
301  {
302  clear();
303  m_bBox = bBox;
304  m_gridSpacing = gridSpacing;
305 
306  const Vec3 dims = m_bBox.getSizes()/gridSpacing;
307  m_dimensions =
308  Vec3L(
309  int(floor(dims[0])),
310  int(floor(dims[1])),
311  int(floor(dims[2]))
312  );
313  m_dimensions = m_dimensions.max(Vec3L(1, 1, 1));
314 
315  m_tablePtr =
317  new ParticleVector[
318  m_dimensions.X()*m_dimensions.Y()*m_dimensions.Z()
319  ]
320  );
321  m_minIndex = Vec3L(0, 0, 0);
322  m_maxIndex = (m_dimensions - 1);
323  }
324  }
325 }
326 
327 #endif