1 #ifndef HASH_PAIR_BUILDER_PERIODIC_H
2 #define HASH_PAIR_BUILDER_PERIODIC_H
18 template<
class Pred,
class OP>
35 buckets_per_dim[2]=
floor(period[2]/pred.getRange(2));
37 for (
unsigned dim = 0; dim<3; ++dim)
38 h_chaining[dim] = period[dim]/buckets_per_dim[dim];
40 dmsg <<
" period = " << period <<
endl;
41 dmsg <<
"buckets per dim = " << buckets_per_dim <<
endl;
44 std::size_t Nbucket = buckets_per_dim[0]*buckets_per_dim[1]*buckets_per_dim[2];
46 std::size_t *buckets =
new size_t[Nbucket];
47 std::size_t *next =
new size_t[size];
48 std::fill(buckets, buckets+Nbucket, END);
49 std::fill(next, next+size, END);
54 int offset[14][3] = {{ 1, 1, 1}, { 0, 1, 1}, {-1, 1, 1},
55 { 1, 0, 1}, { 0, 0, 1}, {-1, 0, 1},
56 { 1,-1, 1}, { 0,-1, 1}, {-1,-1, 1},
57 { 1, 1, 0}, { 0, 1, 0}, {-1, 1, 0},
58 { 1, 0, 0}, { 0, 0, 0}};
61 for(std::size_t i = 0;i<size;++i) {
63 next[i] = buckets[bucket_id];
64 buckets[bucket_id] = i;
68 for (
int bx=0; bx<buckets_per_dim[0]; ++bx) {
69 for (
int by=0; by<buckets_per_dim[1]; ++by) {
70 for (
int bz=0; bz<buckets_per_dim[2]; ++bz) {
71 unsigned bucket_id_self = bz*buckets_per_dim[1]*buckets_per_dim[0]+by*buckets_per_dim[0]+bx;
73 for (
unsigned n=0;
n<neigh;++
n){
74 int bx_neigh, by_neigh, bz_neigh;
77 bx_neigh = bx+offset[
n][0];
80 bx_neigh+=buckets_per_dim[0];
81 shift[0] = -period[0];
83 else if (bx_neigh >= buckets_per_dim[0]) {
85 bx_neigh -=buckets_per_dim[0];
89 by_neigh = by+offset[
n][1];
91 by_neigh+=buckets_per_dim[1];
92 shift[1] = -period[1];
94 else if (by_neigh >= buckets_per_dim[1]) {
95 by_neigh -=buckets_per_dim[1];
98 bz_neigh = bz+offset[
n][2];
100 bz_neigh+=buckets_per_dim[2];
101 shift[2] = -period[2];
103 else if (bz_neigh >= buckets_per_dim[2]) {
104 bz_neigh -=buckets_per_dim[2];
105 shift[2] = period[2];
108 if (bx_neigh >= 0 && bx_neigh<buckets_per_dim[0] &&
109 by_neigh >= 0 && by_neigh<buckets_per_dim[1] &&
110 bz_neigh >= 0 && bz_neigh<buckets_per_dim[2]) {
113 unsigned bucket_id_neigh =
114 bz_neigh*buckets_per_dim[1]*buckets_per_dim[0]+by_neigh*buckets_per_dim[0]+bx_neigh;
116 std::size_t i = buckets[bucket_id_self];
122 j = buckets[bucket_id_neigh];
124 for (
int o=0;o<self_offset;o++){
139 if (bucket_id_self==bucket_id_neigh)
160 for (
unsigned d=0; d<3; ++d)
Vektor< int, 3 > buckets_per_dim
Inform & endl(Inform &inf)
T::PETE_Expr_t::PETE_Return_t max(const PETE_Expr< T > &expr, NDIndex< D > &loc)
PBase::Position_t Position_t
int get_bucket_id(int i, const Pred &)
void for_each(const Pred &pred, const OP &op, Vektor< double, 3 > extend_l, Vektor< double, 3 > extend_r)
Vektor< double, 3 > h_chaining
Vektor< double, 3 > rmin_m
HashPairBuilderPeriodic(PBase &p)
Vektor< double, 3 > rmax_m
PETE_TUTree< FnFloor, typename T::PETE_Expr_t > floor(const PETE_Expr< T > &l)