36 using Tscal = shambase::VecComponent<Tvec>;
40 static constexpr u32 NsideBlockPow = _NsideBlockPow;
41 static constexpr u32 Nside = 1U << NsideBlockPow;
42 static constexpr u32 side_size = Nside;
52 inline static constexpr u32 get_index(std::array<u32, dim> coord)
noexcept {
53 static_assert(dim < 5,
"not implemented above dim 4");
55 if constexpr (dim == 1) {
59 if constexpr (dim == 2) {
60 return coord[0] + Nside * coord[1];
63 if constexpr (dim == 3) {
64 return coord[0] + Nside * coord[1] + Nside * Nside * coord[2];
67 if constexpr (dim == 4) {
68 return coord[0] + Nside * coord[1] + Nside * Nside * coord[2]
69 + Nside * Nside * Nside * coord[3];
75 inline static constexpr i32 get_index_relative(std::array<i32, dim> coord)
noexcept {
76 static_assert(dim < 5,
"not implemented above dim 4");
78 if constexpr (dim == 1) {
82 if constexpr (dim == 2) {
83 return coord[0] + Nside * coord[1];
86 if constexpr (dim == 3) {
87 return coord[0] + Nside * coord[1] + Nside * Nside * coord[2];
90 if constexpr (dim == 4) {
91 return coord[0] + Nside * coord[1] + Nside * Nside * coord[2]
92 + Nside * Nside * Nside * coord[3];
98 inline static constexpr std::array<u32, dim> get_coord(
u32 i)
noexcept {
99 static_assert(dim == 3,
"only in dim 3 for now");
101 if constexpr (dim == 3) {
102 const u32 tmp = i >> NsideBlockPow;
103 return {i % Nside, (tmp) % Nside, (tmp) >> NsideBlockPow};
109 inline static std::pair<Tvec, Tvec> utils_get_cell_coords(
110 std::pair<TgridVec, TgridVec> input,
u32 lid) {
111 Tvec block_min = input.first.template convert<Tscal>();
112 Tvec block_max = input.second.template convert<Tscal>();
113 Tvec delta_cell = (block_max - block_min) / side_size;
115 std::array<u32, dim> l_coord = get_coord(lid);
117 Tvec cell_offset = Tvec{
118 delta_cell.x() * l_coord[0],
119 delta_cell.y() * l_coord[1],
120 delta_cell.z() * l_coord[2]};
122 return {block_min + cell_offset, block_min + cell_offset + delta_cell};
126 inline static void for_each_cell_in_block(Tvec delta_cell, Func &&functor)
noexcept {
127 static_assert(dim == 3,
"implemented only in dim 3");
128 for (
u32 ix = 0; ix < side_size; ix++) {
129 for (
u32 iy = 0; iy < side_size; iy++) {
130 for (
u32 iz = 0; iz < side_size; iz++) {
132 Tvec delta_val = delta_cell * Tvec{ix, iy, iz};
133 functor(i, delta_val);
163 sycl::handler &cgh,
u32 block_cnt,
const char *name, Func &&f) {
167 shambase::parallel_for(cgh, block_cnt * block_size, name, [=](
u64 id_cell) {
168 u32 block_id = id_cell / block_size;
169 f(block_id, id_cell);
174 inline static void for_each_cells_lid(
175 sycl::handler &cgh,
u32 block_cnt,
const char *name, Func &&f) {
179 shambase::parallel_for(cgh, block_cnt * block_size, name, [=](
u64 id_cell) {
180 u32 block_id = id_cell / block_size;
181 u32 lid = id_cell % block_size;
186 template<
class Acccellcoord>
187 inline void for_each_neigh_faces(
189 Acccellcoord acc_block_min,
190 Acccellcoord acc_block_max,
194 block_faces_iter.for_each_object(id_a, [&](
u32 id_b) {
195 const Tvec block_b_min = acc_block_min[id_a];
196 Tvec block_b_max = acc_block_max[id_a];
197 Tvec delta_cell = (block_b_max - block_b_min) / side_size;