#include <iostream>
#include <array>
using namespace std;
template<int32_t num_ghosts,int32_t num_cells,int32_t grid_res>
constexpr std::array<int32_t,num_ghosts> initialize_ghost_to_cell() {
std::array<int32_t,num_ghosts> r{};
int32_t j{0};
for(int32_t i = 0;i < grid_res;++i) r[j++] = i;
for(int32_t i = grid_res;i < num_cells-grid_res;i+=grid_res) {
r[j++] = i;
r[j++] = i+grid_res-1;
}
for(int32_t i = num_cells-grid_res;i < num_cells;++i) r[j++] = i;
return r;
}
template<int32_t num_ghosts,int32_t num_cells,int32_t grid_res>
constexpr std::array<int32_t,num_ghosts> initialize_ghost_to_neighbour() {
std::array<int32_t,num_ghosts> r{};
int32_t j{0};
r[j++] = 0;
for(;j < grid_res-1;++j) r[j] = 1;
r[j++] = 2;
for(int32_t i = grid_res;i < num_cells-grid_res;i+=grid_res) {
r[j++] = 7;
r[j++] = 3;
}
r[j++] = 6;
for(int32_t i = num_cells-grid_res+1;i < num_cells-1;++i) r[j++] = 5;
r[j++] = 4;
return r;
}
// 10 9 10 9 6 5 10 9 6 5 6 5
template<int32_t num_ghosts,int32_t num_cells,int32_t grid_res>
constexpr std::array<int32_t,num_ghosts> initialize_ghost_to_neighbour_cell() {
std::array<int32_t,num_ghosts> r{};
int32_t j{0};
r[j++] = num_cells-grid_res-2;
for(int32_t i = num_cells-(2*grid_res)+1;i < num_cells-grid_res-1; ++i) r[j++] = i;
r[j++] = num_cells-(2*grid_res)+1;
for(int32_t i = grid_res;i < num_cells-grid_res;i+=grid_res) {
r[j++] = i + grid_res - 2;
r[j++] = i + 1;
}
r[j++] = 2*grid_res - 2;
for(int32_t i = grid_res + 1;i < 2 * grid_res - 1;++i) r[j++] = i;
r[j++] = grid_res + 1;
return r;
}
int main() {
std::array<int32_t,12> test{initialize_ghost_to_neighbour_cell<12,16,4>()};
for(auto v:test) std::cout << v << " ";std::cout << std::endl;
std::array<int32_t,8> test0{initialize_ghost_to_neighbour_cell<8,9,3>()};
for(auto v:test0) std::cout << v << " ";std::cout << std::endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8YXJyYXk+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgl0ZW1wbGF0ZTxpbnQzMl90IG51bV9naG9zdHMsaW50MzJfdCBudW1fY2VsbHMsaW50MzJfdCBncmlkX3Jlcz4KCWNvbnN0ZXhwciBzdGQ6OmFycmF5PGludDMyX3QsbnVtX2dob3N0cz4gaW5pdGlhbGl6ZV9naG9zdF90b19jZWxsKCkgewoJCXN0ZDo6YXJyYXk8aW50MzJfdCxudW1fZ2hvc3RzPiBye307CgkJaW50MzJfdCBqezB9OwoJCWZvcihpbnQzMl90IGkgPSAwO2kgPCBncmlkX3JlczsrK2kpIHJbaisrXSA9IGk7CgkJZm9yKGludDMyX3QgaSA9IGdyaWRfcmVzO2kgPCBudW1fY2VsbHMtZ3JpZF9yZXM7aSs9Z3JpZF9yZXMpIHsKCQkJcltqKytdID0gaTsKCQkJcltqKytdID0gaStncmlkX3Jlcy0xOwoJCX0KCQlmb3IoaW50MzJfdCBpID0gbnVtX2NlbGxzLWdyaWRfcmVzO2kgPCBudW1fY2VsbHM7KytpKSByW2orK10gPSBpOwoJCQoJCXJldHVybiByOwoJfQoJdGVtcGxhdGU8aW50MzJfdCBudW1fZ2hvc3RzLGludDMyX3QgbnVtX2NlbGxzLGludDMyX3QgZ3JpZF9yZXM+Cgljb25zdGV4cHIgc3RkOjphcnJheTxpbnQzMl90LG51bV9naG9zdHM+IGluaXRpYWxpemVfZ2hvc3RfdG9fbmVpZ2hib3VyKCkgewoJCXN0ZDo6YXJyYXk8aW50MzJfdCxudW1fZ2hvc3RzPiBye307CgkJaW50MzJfdCBqezB9OwoJCXJbaisrXSA9IDA7CgkJZm9yKDtqIDwgZ3JpZF9yZXMtMTsrK2opIHJbal0gPSAxOwoJCXJbaisrXSA9IDI7CgkJZm9yKGludDMyX3QgaSA9IGdyaWRfcmVzO2kgPCBudW1fY2VsbHMtZ3JpZF9yZXM7aSs9Z3JpZF9yZXMpIHsKCQkJcltqKytdID0gNzsKCQkJcltqKytdID0gMzsKCQl9CgkJcltqKytdID0gNjsKCQlmb3IoaW50MzJfdCBpID0gbnVtX2NlbGxzLWdyaWRfcmVzKzE7aSA8IG51bV9jZWxscy0xOysraSkgcltqKytdID0gNTsKCQlyW2orK10gPSA0OwoJCXJldHVybiByOwoJfQoJLy8gMTAgIDkgMTAgIDkgIDYgIDUgMTAgIDkgIDYgIDUgIDYgIDUKCXRlbXBsYXRlPGludDMyX3QgbnVtX2dob3N0cyxpbnQzMl90IG51bV9jZWxscyxpbnQzMl90IGdyaWRfcmVzPgoJY29uc3RleHByIHN0ZDo6YXJyYXk8aW50MzJfdCxudW1fZ2hvc3RzPiBpbml0aWFsaXplX2dob3N0X3RvX25laWdoYm91cl9jZWxsKCkgewoJCXN0ZDo6YXJyYXk8aW50MzJfdCxudW1fZ2hvc3RzPiBye307CgkJaW50MzJfdCBqezB9OwoJCXJbaisrXSA9IG51bV9jZWxscy1ncmlkX3Jlcy0yOwoJCWZvcihpbnQzMl90IGkgPSBudW1fY2VsbHMtKDIqZ3JpZF9yZXMpKzE7aSA8IG51bV9jZWxscy1ncmlkX3Jlcy0xOyArK2kpIHJbaisrXSA9IGk7CgkJcltqKytdID0gbnVtX2NlbGxzLSgyKmdyaWRfcmVzKSsxOwoJCWZvcihpbnQzMl90IGkgPSBncmlkX3JlcztpIDwgbnVtX2NlbGxzLWdyaWRfcmVzO2krPWdyaWRfcmVzKSB7CgkJCXJbaisrXSA9IGkgKyBncmlkX3JlcyAtIDI7CgkJCXJbaisrXSA9IGkgKyAxOwoJCX0KCQlyW2orK10gPSAyKmdyaWRfcmVzIC0gMjsKCQlmb3IoaW50MzJfdCBpID0gZ3JpZF9yZXMgKyAxO2kgPCAyICogZ3JpZF9yZXMgLSAxOysraSkgcltqKytdID0gaTsKCQlyW2orK10gPSBncmlkX3JlcyArIDE7CgkJcmV0dXJuIHI7Cgl9CmludCBtYWluKCkgewoJc3RkOjphcnJheTxpbnQzMl90LDEyPiB0ZXN0e2luaXRpYWxpemVfZ2hvc3RfdG9fbmVpZ2hib3VyX2NlbGw8MTIsMTYsND4oKX07Cglmb3IoYXV0byB2OnRlc3QpIHN0ZDo6Y291dCA8PCB2IDw8ICIgIjtzdGQ6OmNvdXQgPDwgc3RkOjplbmRsOwoJc3RkOjphcnJheTxpbnQzMl90LDg+IHRlc3Qwe2luaXRpYWxpemVfZ2hvc3RfdG9fbmVpZ2hib3VyX2NlbGw8OCw5LDM+KCl9OwoJZm9yKGF1dG8gdjp0ZXN0MCkgc3RkOjpjb3V0IDw8IHYgPDwgIiAiO3N0ZDo6Y291dCA8PCBzdGQ6OmVuZGw7CglyZXR1cm4gMDsKfQ==