40namespace decomposition {
66inline int get_neighbor_rank(
const Decomposition &decomp,
int rank,
67 const Int3 &direction) {
68 const auto &grid = get_grid(decomp);
69 int num_domains = get_num_domains(decomp);
71 if (rank < 0 || rank >= num_domains) {
76 int rank_z = rank / (grid[0] * grid[1]);
77 int rank_y = (rank % (grid[0] * grid[1])) / grid[0];
78 int rank_x = rank % grid[0];
81 int neighbor_x = rank_x + direction[0];
82 int neighbor_y = rank_y + direction[1];
83 int neighbor_z = rank_z + direction[2];
87 neighbor_x = (neighbor_x + grid[0]) % grid[0];
88 neighbor_y = (neighbor_y + grid[1]) % grid[1];
89 neighbor_z = (neighbor_z + grid[2]) % grid[2];
93 neighbor_z * (grid[0] * grid[1]) + neighbor_y * grid[0] + neighbor_x;
121inline std::map<Int3, int> find_face_neighbors(
const Decomposition &decomp,
123 std::map<Int3, int> neighbors;
126 std::vector<Int3> directions = {{1, 0, 0}, {-1, 0, 0}, {0, 1, 0},
127 {0, -1, 0}, {0, 0, 1}, {0, 0, -1}};
129 for (
const auto &dir : directions) {
130 int neighbor_rank = get_neighbor_rank(decomp, rank, dir);
132 neighbors[dir] = neighbor_rank;
160inline std::map<Int3, int> find_all_neighbors(
const Decomposition &decomp,
162 std::map<Int3, int> neighbors;
165 for (
int dx = -1; dx <= 1; ++dx) {
166 for (
int dy = -1; dy <= 1; ++dy) {
167 for (
int dz = -1; dz <= 1; ++dz) {
168 if (dx == 0 && dy == 0 && dz == 0) {
172 Int3 direction{dx, dy, dz};
173 int neighbor_rank = get_neighbor_rank(decomp, rank, direction);
175 neighbors[direction] = neighbor_rank;
Core type definitions for World parameters.
Domain decomposition for parallel MPI simulations.