14 #include "Foundation/StringUtil.h"
21 template <
typename TmplParticle,
typename TmplConnection>
22 DistConnections<TmplParticle,TmplConnection>::DistConnections(
25 const BoundingBox &bBox,
26 const BoolVector &circDimensions
28 : m_connectionPoolPtr(new ConnectionPool(4096)),
31 m_minRadius(std::numeric_limits<double>::max()),
32 m_maxRadius(-std::numeric_limits<double>::max()),
34 m_minPt(bBox.getMinPt()),
35 m_maxPt(bBox.getMaxPt()),
36 m_defaultTag(defaultTag)
38 const double gridSize =
59 template <
typename TmplParticle,
typename TmplConnection>
60 DistConnections<TmplParticle,TmplConnection>::~DistConnections()
64 template <
typename TmplParticle,
typename TmplConnection>
65 int DistConnections<TmplParticle,TmplConnection>::getNumParticles()
const
67 return m_nTablePtr->size();
70 template <
typename TmplParticle,
typename TmplConnection>
71 int DistConnections<TmplParticle,TmplConnection>::getNumConnections()
const
73 return m_connectionSet.size();
76 template <
typename TmplParticle,
typename TmplConnection>
77 double DistConnections<TmplParticle,TmplConnection>::getMinRadius()
const
82 template <
typename TmplParticle,
typename TmplConnection>
83 double DistConnections<TmplParticle,TmplConnection>::getMaxRadius()
const
88 template <
typename TmplParticle,
typename TmplConnection>
89 typename DistConnections<TmplParticle,TmplConnection>::ParticleConstIterator
90 DistConnections<TmplParticle,TmplConnection>::getParticleIterator()
const
92 return m_nTablePtr->getIterator();
95 template <
typename TmplParticle,
typename TmplConnection>
97 DistConnections<TmplParticle,TmplConnection>::createConnection(
103 m_connectionSet.insert(
104 m_connectionPoolPtr->construct(p1.getId(), p2.getId(), tag)
107 template <
typename TmplParticle>
111 bool operator()(
const TmplParticle &p1,
const TmplParticle &p2)
const
113 return (p1.getId() < p2.getId());
116 bool operator()(
const TmplParticle *p1,
const TmplParticle *p2)
const
118 return (p1->getId() < p2->getId());
122 template <
typename TmplParticle,
typename TmplConnection>
123 template <
typename TmplParticleIterator>
126 TmplParticleIterator it,
130 typedef std::set<Particle *, CmpParticleId<Particle> > ParticleSet;
134 Particle &p = it.next();
138 m_nTablePtr->resize(getParticleBBox(), 4.1*getMinRadius(), 2.1*getMaxRadius());
141 typename ParticleSet::const_iterator pIt = pSet.begin();
146 typename NTable::ParticleVector nVector =
147 m_nTablePtr->getNeighbourVector(
149 (*pIt)->getRad() + m_maxDist
152 typename NTable::ParticleVector::const_iterator nIt = nVector.begin();
153 nIt != nVector.end();
157 Particle *p1 = (*pIt);
158 Particle *p2 = (*nIt);
162 (pSet.find(p1) != pSet.end())
164 (pSet.find(p2) != pSet.end())
166 (p1->getId() < p2->getId())
170 ((pSet.find(p1)==pSet.end()) && (pSet.find(p2)!= pSet.end()))
172 ((pSet.find(p1)!=pSet.end()) && (pSet.find(p2)== pSet.end()))
177 ((*pIt)->getId() < (*nIt)->getId())
183 ((*pIt)->getId() < (*nIt)->getId())
188 const double radiusSum =
189 m_maxDist + p1->getRad() + p2->getRad();
190 const double radiusSumSqrd = radiusSum*radiusSum;
193 (p1->getPos() - p2->getPos()).norm2()
200 <<
"creating connection: \n"
201 << StringUtil::toString(*p1)
203 << StringUtil::toString(*p2) <<
"\n";
205 createConnection(*p1, *p2, tag);
212 template <
typename TmplParticle,
typename TmplConnection>
213 template <
typename TmplParticleIterator>
215 DistConnections<TmplParticle,TmplConnection>::create(
216 TmplParticleIterator it
219 create(it, getDefaultTag());
222 template <
typename TmplParticle,
typename TmplConnection>
224 DistConnections<TmplParticle,TmplConnection>::insert(Particle &p)
226 if (p.getRad() < m_minRadius)
228 m_minRadius = p.getRad();
230 if (p.getRad() > m_maxRadius)
232 m_maxRadius = p.getRad();
235 m_nTablePtr->insert(p);
237 for (
int i = 0; i < 3; i++)
239 if (!(m_nTablePtr->getPeriodicDimensions()[i]))
241 if (p.getPos()[i]-p.getRad() < m_minPt[i])
243 m_minPt[i] = p.getPos()[i]-p.getRad();
245 if (p.getPos()[i]+p.getRad() > m_maxPt[i])
247 m_maxPt[i] = p.getPos()[i]+p.getRad();
253 template <
typename TmplParticle,
typename TmplConnection>
254 typename DistConnections<TmplParticle,TmplConnection>::Tag
255 DistConnections<TmplParticle,TmplConnection>::getDefaultTag()
const
260 template <
typename TmplParticle,
typename TmplConnection>
262 DistConnections<TmplParticle,TmplConnection>::setDefaultTag(Tag defaultTag)
264 m_defaultTag = defaultTag;
267 template <
typename TmplParticle,
typename TmplConnection>
269 DistConnections<TmplParticle,TmplConnection>::getParticleBBox()
const
271 return BoundingBox(m_minPt, m_maxPt);