1 #include "objects/finders/PeriodicFinder.h"
2 #include "objects/containers/StaticArray.h"
3 
4 NAMESPACE_SPH_BEGIN
5 
PeriodicFinder(AutoPtr<ISymmetricFinder> && actual,const Box & domain,SharedPtr<IScheduler> scheduler)6 PeriodicFinder::PeriodicFinder(AutoPtr<ISymmetricFinder>&& actual,
7     const Box& domain,
8     SharedPtr<IScheduler> scheduler)
9     : actual(std::move(actual))
10     , domain(domain)
11     , scheduler(scheduler)
12     , extra(*scheduler) {}
13 
findAll(const Size index,const Float radius,Array<NeighborRecord> & neighbors) const14 Size PeriodicFinder::findAll(const Size index, const Float radius, Array<NeighborRecord>& neighbors) const {
15     return this->findAll(values[index], radius, neighbors);
16 }
17 
18 static const StaticArray<Vector, 3> UNIT = {
19     Vector(1._f, 0._f, 0._f),
20     Vector(0._f, 1._f, 0._f),
21     Vector(0._f, 0._f, 1._f),
22 };
23 
findAll(const Vector & pos,const Float radius,Array<NeighborRecord> & neighbors) const24 Size PeriodicFinder::findAll(const Vector& pos,
25     const Float radius,
26     Array<NeighborRecord>& neighbors) const {
27     Size count = actual->findAll(pos, radius, neighbors);
28 
29     for (Size i = 0; i < 3; ++i) {
30         if (pos[i] < domain.lower()[i] + radius) {
31             count += actual->findAll(pos + domain.size()[i] * UNIT[i], radius, extra.local());
32             neighbors.pushAll(extra.local());
33         }
34         if (pos[i] > domain.upper()[i] - radius) {
35             count += actual->findAll(pos - domain.size()[i] * UNIT[i], radius, extra.local());
36             neighbors.pushAll(extra.local());
37         }
38     }
39     return count;
40 }
41 
42 NAMESPACE_SPH_END
43