16 #ifndef HASH_PAIR_BUILDER_PERIODIC_PARALLEL_H
17 #define HASH_PAIR_BUILDER_PERIODIC_PARALLEL_H
33 template<
class Pred,
class OP>
48 parallel_dims[0] = !(globDomain[0]==locDomain[0]);
49 parallel_dims[1] = !(globDomain[1]==locDomain[1]);
50 parallel_dims[2] = !(globDomain[2]==locDomain[2]);
53 period=extend_r-extend_l;
57 for (
unsigned i=0; i<3; ++i) {
58 extend_l_local[i] = locDomain[i].first()*
hr_m[i]+extend_l[i];
59 extend_r_local[i] = extend_l[i]+(locDomain[i].last()+1)*
hr_m[i];
60 domain_width_local[i] = extend_r_local[i]-extend_l_local[i];
66 buckets_per_dim[2]=
floor(domain_width_local[2]/pred.getRange(2));
68 for (
unsigned dim = 0; dim<3; ++dim)
69 h_chaining[dim] = domain_width_local[dim]/buckets_per_dim[dim];
82 std::size_t Nbucket = buckets_per_dim[0]*buckets_per_dim[1]*buckets_per_dim[2];
84 std::size_t *buckets =
new size_t[Nbucket];
85 std::size_t *next =
new size_t[size];
86 std::fill(buckets, buckets+Nbucket, END);
87 std::fill(next, next+size, END);
92 int offset[14][3] = {{ 1, 1, 1}, { 0, 1, 1}, {-1, 1, 1},
93 { 1, 0, 1}, { 0, 0, 1}, {-1, 0, 1},
94 { 1,-1, 1}, { 0,-1, 1}, {-1,-1, 1},
95 { 1, 1, 0}, { 0, 1, 0}, {-1, 1, 0},
96 { 1, 0, 0}, { 0, 0, 0}};
99 for(std::size_t i = 0;i<size;++i)
103 next[i] = buckets[bucket_id];
104 buckets[bucket_id] = i;
108 for (
int bx=0+
int(!parallel_dims[0]); bx<buckets_per_dim[0]-int(!parallel_dims[0]); ++bx) {
109 for (
int by=0+
int(!parallel_dims[1]); by<buckets_per_dim[1]-int(!parallel_dims[1]); ++by) {
110 for (
int bz=0+
int(!parallel_dims[2]); bz<buckets_per_dim[2]-int(!parallel_dims[2]); ++bz) {
111 unsigned bucket_id_self = bz*buckets_per_dim[1]*buckets_per_dim[0]+by*buckets_per_dim[0]+bx;
113 for (
unsigned n=0;
n<neigh;++
n){
114 int bx_neigh, by_neigh, bz_neigh;
117 bx_neigh = bx+offset[
n][0];
119 if (!parallel_dims[0]) {
122 bx_neigh+=(buckets_per_dim[0]-2);
123 shift[0] = -period[0];
125 else if (bx_neigh == (buckets_per_dim[0]-1)) {
127 bx_neigh -= (buckets_per_dim[0]-2);
128 shift[0] = period[0];
132 by_neigh = by+offset[
n][1];
133 if (!parallel_dims[1]) {
135 by_neigh+=(buckets_per_dim[1]-2);
136 shift[1] = -period[0];
138 else if (by_neigh == (buckets_per_dim[1]-1)) {
139 by_neigh -=(buckets_per_dim[1]-2);
140 shift[1] = period[1];
144 bz_neigh = bz+offset[
n][2];
145 if (!parallel_dims[2]) {
147 bz_neigh+=(buckets_per_dim[2]-2);
148 shift[2] = -period[2];
150 else if (bz_neigh == (buckets_per_dim[2]-1)) {
151 bz_neigh -=(buckets_per_dim[2]-2);
152 shift[2] = period[2];
156 if (bx_neigh >= 0 && bx_neigh<buckets_per_dim[0] &&
157 by_neigh >= 0 && by_neigh<buckets_per_dim[1] &&
158 bz_neigh >= 0 && bz_neigh<buckets_per_dim[2]) {
160 unsigned bucket_id_neigh =
161 bz_neigh*buckets_per_dim[1]*buckets_per_dim[0]+by_neigh*buckets_per_dim[0]+bx_neigh;
164 std::size_t i = buckets[bucket_id_self];
171 j = buckets[bucket_id_neigh];
173 for (
int o=0;o<self_offset;o++){
186 if (bucket_id_self==bucket_id_neigh)
210 for (
unsigned d=0; d<3; ++d)
Vektor< double, 3 > h_chaining
void for_each(const Pred &pred, const OP &op, Vektor< double, 3 > extend_l, Vektor< double, 3 > extend_r)
HashPairBuilderPeriodicParallel(PBase &p)
int get_bucket_id(int i, const Pred &)
PBase::Position_t Position_t
T::PETE_Expr_t::PETE_Return_t max(const PETE_Expr< T > &expr, NDIndex< D > &loc)
Vektor< int, 3 > buckets_per_dim
Vektor< double, 3 > rmax_m
PETE_TUTree< FnFloor, typename T::PETE_Expr_t > floor(const PETE_Expr< T > &l)
Vektor< double, 3 > rmin_m