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