1 #ifndef DIY_PARTNERS_COMMON_HPP
2 #define DIY_PARTNERS_COMMON_HPP
4 #include "../decomposition.hpp"
5 #include "../types.hpp"
15 DimK(
int dim_,
int k_):
16 dim(dim_), size(k_) {}
22 typedef std::vector<int> CoordVector;
23 typedef std::vector<int> DivisionVector;
24 typedef std::vector<DimK> KVSVector;
30 template<
class Decomposer_>
31 RegularPartners(
const Decomposer_& decomposer,
int k,
bool contiguous =
true):
32 divisions_(decomposer.divisions),
33 contiguous_(contiguous) { factor(k, divisions_, kvs_); fill_steps(); }
36 bool contiguous =
true):
37 divisions_(divs), kvs_(kvs),
38 contiguous_(contiguous) { fill_steps(); }
40 size_t rounds()
const {
return kvs_.size(); }
41 int size(
int round)
const {
return kvs_[round].size; }
42 int dim(
int round)
const {
return kvs_[round].dim; }
44 int step(
int round)
const {
return steps_[round]; }
46 const DivisionVector& divisions()
const {
return divisions_; }
47 const KVSVector& kvs()
const {
return kvs_; }
48 bool contiguous()
const {
return contiguous_; }
51 inline void factor(
int k,
const DivisionVector& divisions, KVSVector& kvs);
53 inline void fill(
int round,
int gid, std::vector<int>& partners)
const;
54 inline int group_position(
int round,
int c,
int step)
const;
57 inline void fill_steps();
59 inline void factor(
int k,
int tot_b, std::vector<int>& kvs);
61 DivisionVector divisions_;
64 std::vector<int> steps_;
70 diy::RegularPartners::
75 std::vector<int> cur_steps(divisions().size(), 1);
77 for (
size_t r = 0; r < rounds(); ++r)
79 steps_.push_back(cur_steps[kvs_[r].dim]);
80 cur_steps[kvs_[r].dim] *= kvs_[r].size;
84 std::vector<int> cur_steps(divisions().begin(), divisions().end());
85 for (
size_t r = 0; r < rounds(); ++r)
87 cur_steps[kvs_[r].dim] /= kvs_[r].size;
88 steps_.push_back(cur_steps[kvs_[r].dim]);
94 diy::RegularPartners::
95 fill(
int round,
int gid, std::vector<int>& partners)
const
97 const DimK& kv = kvs_[round];
98 partners.reserve(kv.size);
100 int step = this->step(round);
103 Decomposer::gid_to_coords(gid, coords, divisions_);
104 int c = coords[kv.dim];
105 int pos = group_position(round, c, step);
107 int partner = c - pos * step;
108 coords[kv.dim] = partner;
109 int partner_gid = Decomposer::coords_to_gid(coords, divisions_);
110 partners.push_back(partner_gid);
112 for (
int k = 1; k < kv.size; ++k)
115 coords[kv.dim] = partner;
116 partner_gid = Decomposer::coords_to_gid(coords, divisions_);
117 partners.push_back(partner_gid);
123 diy::RegularPartners::
124 group_position(
int round,
int c,
int step)
const
130 int g = c % step + c / (step * kvs_[round].size) * step;
131 int p = c / step % kvs_[round].size;
132 static_cast<void>(g);
140 diy::RegularPartners::
141 factor(
int k,
const DivisionVector& divisions, KVSVector& kvs)
144 std::vector< std::vector<int> > tmp_kvs(divisions.size());
145 for (
unsigned i = 0; i < divisions.size(); ++i)
146 factor(k, divisions[i], tmp_kvs[i]);
149 std::vector<int> round_per_dim(divisions.size(), 0);
153 bool changed =
false;
154 for (
unsigned i = 0; i < divisions.size(); ++i)
156 if (round_per_dim[i] == (
int) tmp_kvs[i].size())
158 kvs.push_back(DimK(i, tmp_kvs[i][round_per_dim[i]++]));
168 diy::RegularPartners::
169 factor(
int k,
int tot_b, std::vector<int>& kv)
185 for (j = k - 1; j > 1; j--)
Definition: common.hpp:10
Decomposes a regular (discrete or continuous) domain into even blocks; creates Links with Bounds alon...
Definition: decomposition.hpp:75
Definition: common.hpp:13