19#ifndef EXAMPLES_MPI_DOMAIN_PARTITION_HPP
20#define EXAMPLES_MPI_DOMAIN_PARTITION_HPP
25#include <boost/geometry.hpp>
26#include <boost/geometry/geometries/adapted/boost_array.hpp>
27#include <boost/geometry/geometries/box.hpp>
28#include <boost/geometry/index/rtree.hpp>
30BOOST_GEOMETRY_REGISTER_BOOST_ARRAY_CS(cs::cartesian)
37 typedef boost::array<ptrdiff_t, NDIM> point;
38 typedef boost::geometry::model::box<point> box;
39 typedef std::pair<box, int> process;
41 DomainPartition(point lo, point hi,
int num_processes)
43 split(box(lo, hi), num_processes);
45 for (
int i = 0; i < num_processes; ++i)
46 rtree.insert(std::make_pair(subdomains[i], i));
49 std::pair<int, ptrdiff_t> index(point p)
const
51 namespace bgi = boost::geometry::index;
53 for (
const process& v : rtree | bgi::adaptors::queried(bgi::intersects(p))) {
54 return std::make_pair(v.second, local_index(v.first, p));
58 return std::make_pair(0, 0l);
61 size_t size(
size_t process)
const
63 if (process >= subdomains.size())
66 point lo = subdomains[process].min_corner();
67 point hi = subdomains[process].max_corner();
71 for (
int i = 0; i < NDIM; ++i)
72 v *= hi[i] - lo[i] + 1;
77 box domain(
size_t process)
const
79 if (process < subdomains.size())
80 return subdomains[process];
84 for (
int i = 0; i < NDIM; ++i) {
94 std::vector<box> subdomains;
96 boost::geometry::index::rtree<
98 boost::geometry::index::quadratic<16>>
101 static ptrdiff_t local_index(box domain, point p)
103 point lo = domain.min_corner();
104 point hi = domain.max_corner();
106 ptrdiff_t stride = 1, idx = 0;
107 for (
int i = 0; i < NDIM; ++i) {
108 idx += (p[i] - lo[i]) * stride;
109 stride *= hi[i] - lo[i] + 1;
115 void split(box domain,
int np)
118 subdomains.push_back(domain);
122 point lo = domain.min_corner();
123 point hi = domain.max_corner();
127 for (
int i = 1; i < NDIM; ++i)
128 if (hi[i] - lo[i] > hi[wd] - lo[wd])
131 ptrdiff_t mid = lo[wd] + (hi[wd] - lo[wd]) * (np / 2) / np;
136 sd1.max_corner()[wd] = mid;
137 sd2.min_corner()[wd] = mid + 1;
140 split(sd2, np - np / 2);