14 #include "Foundation/StringUtil.h"
22 template <
typename TmplSphere,
typename TmplIdPair>
23 SphereNeighbours<TmplSphere,TmplIdPair>::SphereNeighbours(
25 const BoundingBox &bBox,
26 const BoolVector &circDimensions
28 : m_connectionPoolPtr(new IdPairPool(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())
37 const double gridSize =
58 template <
typename TmplSphere,
typename TmplIdPair>
59 SphereNeighbours<TmplSphere,TmplIdPair>::~SphereNeighbours()
63 template <
typename TmplSphere,
typename TmplIdPair>
64 int SphereNeighbours<TmplSphere,TmplIdPair>::getNumSpheres()
const
66 return m_nTablePtr->size();
69 template <
typename TmplSphere,
typename TmplIdPair>
70 int SphereNeighbours<TmplSphere,TmplIdPair>::getNumIdPairs()
const
72 return m_connectionSet.size();
75 template <
typename TmplSphere,
typename TmplIdPair>
76 double SphereNeighbours<TmplSphere,TmplIdPair>::getMinRadius()
const
81 template <
typename TmplSphere,
typename TmplIdPair>
82 double SphereNeighbours<TmplSphere,TmplIdPair>::getMaxRadius()
const
87 template <
typename TmplSphere,
typename TmplIdPair>
88 typename SphereNeighbours<TmplSphere,TmplIdPair>::SphereConstIterator
89 SphereNeighbours<TmplSphere,TmplIdPair>::getSphereIterator()
const
91 return m_nTablePtr->getIterator();
94 template <
typename TmplSphere,
typename TmplIdPair>
95 const typename SphereNeighbours<TmplSphere,TmplIdPair>::IdPair &
96 SphereNeighbours<TmplSphere,TmplIdPair>::createIdPair(
102 **(m_connectionSet.insert(
103 m_connectionPoolPtr->construct(p1.getId(), p2.getId())
107 template <
typename TmplSphere>
111 bool operator()(
const TmplSphere &p1,
const TmplSphere &p2)
const
113 return (p1.getId() < p2.getId());
116 bool operator()(
const TmplSphere *p1,
const TmplSphere *p2)
const
118 return (p1->getId() < p2->getId());
122 template <
typename TmplType>
126 typedef const TmplType& result_type;
127 typedef const TmplType* argument_type;
130 operator()(argument_type a)
const
134 template <
typename TmplSphere,
typename TmplIdPair>
135 template <
typename TmplSphereIterator>
136 typename SphereNeighbours<TmplSphere,TmplIdPair>::IdPairVector
138 TmplSphereIterator it
142 typedef std::set<Sphere *, CmpSphereId<Sphere> > SphereSet;
150 ConstIdPairSet idPairSet;
161 typename SphereSet::const_iterator pIt = pSet.begin();
167 typename NTable::ParticleVector nVector =
168 m_nTablePtr->getNeighbourVector(
170 (*pIt)->getRad() + m_maxDist
175 typename NTable::ParticleVector::const_iterator nIt = nVector.begin();
176 nIt != nVector.end();
185 (p1->getId() < p2->getId())
187 (pSet.find(p1) != pSet.end())
189 (pSet.find(p2) != pSet.end())
193 ((pSet.find(p1)==pSet.end()) && (pSet.find(p2)!= pSet.end()))
195 ((pSet.find(p1)!=pSet.end()) && (pSet.find(p2)== pSet.end()))
200 ((*pIt)->getId() < (*nIt)->getId())
206 ((*pIt)->getId() < (*nIt)->getId())
211 const double radiusSumPlusTol =
212 m_maxDist + p1->getRad() + p2->getRad();
213 const double radiusSumPlusTolSqrd =
214 radiusSumPlusTol*radiusSumPlusTol;
217 (p1->getPos() - p2->getPos()).norm2()
219 (radiusSumPlusTolSqrd)
222 idPairSet.insert(&createIdPair(*p1, *p2));
227 IdPairVector idPairVector;
228 idPairVector.reserve(idPairSet.size());
232 std::back_insert_iterator<IdPairVector>(idPairVector),
238 template <
typename TmplSphere,
typename TmplIdPair>
240 SphereNeighbours<TmplSphere,TmplIdPair>::insert(
Sphere &p)
242 if (p.getRad() < m_minRadius)
244 m_minRadius = p.getRad();
246 if (p.getRad() > m_maxRadius)
248 m_maxRadius = p.getRad();
251 m_nTablePtr->insert(p);
253 for (
int i = 0; i < 3; i++)
255 if (!(m_nTablePtr->getPeriodicDimensions()[i]))
257 if (p.getPos()[i]-p.getRad() < m_minPt[i])
259 m_minPt[i] = p.getPos()[i]-p.getRad();
261 if (p.getPos()[i]+p.getRad() > m_maxPt[i])
263 m_maxPt[i] = p.getPos()[i]+p.getRad();
269 template <
typename TmplSphere,
typename TmplIdPair>
271 SphereNeighbours<TmplSphere,TmplIdPair>::getSphereBBox()
const
273 return BoundingBox(m_minPt, m_maxPt);