ESyS-Particle  2.3.2
DistConnections.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 #include "Foundation/StringUtil.h"
15 #include <limits>
16 
17 namespace esys
18 {
19  namespace lsm
20  {
21  template <typename TmplParticle, typename TmplConnection>
23  double maxDist,
24  Tag defaultTag,
25  const BoundingBox &bBox,
26  const BoolVector &circDimensions
27  )
28  : m_connectionPoolPtr(new ConnectionPool(4096)),
29  m_connectionSet(),
30  m_nTablePtr(),
31  m_minRadius(std::numeric_limits<double>::max()),
32  m_maxRadius(-std::numeric_limits<double>::max()),
33  m_maxDist(maxDist),
34  m_minPt(bBox.getMinPt()),
35  m_maxPt(bBox.getMaxPt()),
36  m_defaultTag(defaultTag)
37  {
38  const double gridSize =
39  (
40  max(
41  bBox.getSizes()[0],
42  max(
43  bBox.getSizes()[1],
44  bBox.getSizes()[2]
45  )
46  )
47  )/5.0;
48  m_nTablePtr =
49  NTablePtr(
50  new NTable(
51  bBox,
52  gridSize,
53  circDimensions,
54  2*gridSize
55  )
56  );
57  }
58 
59  template <typename TmplParticle, typename TmplConnection>
61  {
62  }
63 
64  template <typename TmplParticle, typename TmplConnection>
66  {
67  return m_nTablePtr->size();
68  }
69 
70  template <typename TmplParticle, typename TmplConnection>
72  {
73  return m_connectionSet.size();
74  }
75 
76  template <typename TmplParticle, typename TmplConnection>
78  {
79  return m_minRadius;
80  }
81 
82  template <typename TmplParticle, typename TmplConnection>
84  {
85  return m_maxRadius;
86  }
87 
88  template <typename TmplParticle, typename TmplConnection>
91  {
92  return m_nTablePtr->getIterator();
93  }
94 
95  template <typename TmplParticle, typename TmplConnection>
96  void
98  const Particle &p1,
99  const Particle &p2,
100  Tag tag
101  )
102  {
103  m_connectionSet.insert(
104  m_connectionPoolPtr->construct(p1.getId(), p2.getId(), tag)
105  );
106  }
107  template <typename TmplParticle>
109  {
110  public:
111  bool operator()(const TmplParticle &p1, const TmplParticle &p2) const
112  {
113  return (p1.getId() < p2.getId());
114  }
115 
116  bool operator()(const TmplParticle *p1, const TmplParticle *p2) const
117  {
118  return (p1->getId() < p2->getId());
119  }
120  };
121 
122  template <typename TmplParticle, typename TmplConnection>
123  template <typename TmplParticleIterator>
124  void
126  TmplParticleIterator it,
127  Tag tag
128  )
129  {
130  typedef std::set<Particle *, CmpParticleId<Particle> > ParticleSet;
131  ParticleSet pSet;
132  while (it.hasNext())
133  {
134  Particle &p = it.next();
135  insert(p);
136  pSet.insert(&p);
137  }
138  m_nTablePtr->resize(getParticleBBox(), 4.1*getMinRadius(), 2.1*getMaxRadius());
139 
140  for (
141  typename ParticleSet::const_iterator pIt = pSet.begin();
142  pIt != pSet.end();
143  pIt++
144  )
145  {
146  typename NTable::ParticleVector nVector =
147  m_nTablePtr->getNeighbourVector(
148  (*pIt)->getPos(),
149  (*pIt)->getRad() + m_maxDist
150  );
151  for (
152  typename NTable::ParticleVector::const_iterator nIt = nVector.begin();
153  nIt != nVector.end();
154  nIt++
155  )
156  {
157  Particle *p1 = (*pIt);
158  Particle *p2 = (*nIt);
159 
160  if (
161  (
162  (pSet.find(p1) != pSet.end())
163  &&
164  (pSet.find(p2) != pSet.end())
165  &&
166  (p1->getId() < p2->getId())
167  )
168  ||
169  (
170  ((pSet.find(p1)==pSet.end()) && (pSet.find(p2)!= pSet.end()))
171  ||
172  ((pSet.find(p1)!=pSet.end()) && (pSet.find(p2)== pSet.end()))
173  )
174  )
175  {
176  p1 =
177  ((*pIt)->getId() < (*nIt)->getId())
178  ?
179  (*pIt)
180  :
181  (*nIt);
182  p2 =
183  ((*pIt)->getId() < (*nIt)->getId())
184  ?
185  (*nIt)
186  :
187  (*pIt);
188  const double radiusSum =
189  m_maxDist + p1->getRad() + p2->getRad();
190  const double radiusSumSqrd = radiusSum*radiusSum;
191 
192  if (
193  (p1->getPos() - p2->getPos()).norm2()
194  <=
195  (radiusSumSqrd)
196  )
197  {
198 #if 0
199  console.Debug()
200  << "creating connection: \n"
201  << StringUtil::toString(*p1)
202  << "->"
203  << StringUtil::toString(*p2) << "\n";
204 #endif
205  createConnection(*p1, *p2, tag);
206  }
207  }
208  }
209  }
210  }
211 
212  template <typename TmplParticle, typename TmplConnection>
213  template <typename TmplParticleIterator>
214  void
216  TmplParticleIterator it
217  )
218  {
219  create(it, getDefaultTag());
220  }
221 
222  template <typename TmplParticle, typename TmplConnection>
223  void
225  {
226  if (p.getRad() < m_minRadius)
227  {
228  m_minRadius = p.getRad();
229  }
230  if (p.getRad() > m_maxRadius)
231  {
232  m_maxRadius = p.getRad();
233  }
234 
235  m_nTablePtr->insert(p);
236 
237  for (int i = 0; i < 3; i++)
238  {
239  if (!(m_nTablePtr->getPeriodicDimensions()[i]))
240  {
241  if (p.getPos()[i]-p.getRad() < m_minPt[i])
242  {
243  m_minPt[i] = p.getPos()[i]-p.getRad();
244  }
245  if (p.getPos()[i]+p.getRad() > m_maxPt[i])
246  {
247  m_maxPt[i] = p.getPos()[i]+p.getRad();
248  }
249  }
250  }
251  }
252 
253  template <typename TmplParticle, typename TmplConnection>
256  {
257  return m_defaultTag;
258  }
259 
260  template <typename TmplParticle, typename TmplConnection>
261  void
263  {
264  m_defaultTag = defaultTag;
265  }
266 
267  template <typename TmplParticle, typename TmplConnection>
270  {
271  return BoundingBox(m_minPt, m_maxPt);
272  }
273 
274  }
275 }