39 static constexpr u32 dim = 3;
42 template<StencilPosition stencil_pos>
43 inline static constexpr std::array<i32, 3> get_relative_offset_vec() {
44 if constexpr (stencil_pos == xp1) {
45 return std::array<i32, 3>{1, 0, 0};
46 }
else if constexpr (stencil_pos == xm1) {
47 return std::array<i32, 3>{-1, 0, 0};
48 }
else if constexpr (stencil_pos == yp1) {
49 return std::array<i32, 3>{0, 1, 0};
50 }
else if constexpr (stencil_pos == ym1) {
51 return std::array<i32, 3>{0, -1, 0};
52 }
else if constexpr (stencil_pos == zp1) {
53 return std::array<i32, 3>{0, 0, 1};
54 }
else if constexpr (stencil_pos == zm1) {
55 return std::array<i32, 3>{0, 0, -1};
62 template<StencilPosition stencil_pos>
63 inline static constexpr i32 get_relative_offset() {
64 return AMRBlock::get_index_relative(get_relative_offset_vec<stencil_pos>());
67 template<StencilPosition stencil_pos>
71 std::array<u32, dim> lcoord,
76 i32 offset_lcoord =
i32(local_cell_id) + get_relative_offset<stencil_pos>();
78 if (offset_lcoord > 0 && offset_lcoord < AMRBlock::block_size) {
85 constexpr std::array<i32, 3> off = get_relative_offset_vec<stencil_pos>();
88 std::array<i32, dim> coord_off = {
95 if constexpr (stencil_pos == xp1) {
96 coord_off[0] -= AMRBlock::side_size;
97 }
else if constexpr (stencil_pos == xm1) {
98 coord_off[0] += AMRBlock::side_size;
99 }
else if constexpr (stencil_pos == yp1) {
100 coord_off[1] -= AMRBlock::side_size;
101 }
else if constexpr (stencil_pos == ym1) {
102 coord_off[1] += AMRBlock::side_size;
103 }
else if constexpr (stencil_pos == zp1) {
104 coord_off[2] -= AMRBlock::side_size;
105 }
else if constexpr (stencil_pos == zm1) {
106 coord_off[2] += AMRBlock::side_size;
115 st.block_idx * AMRBlock::block_size
117 {
u32(coord_off[0]),
u32(coord_off[1]),
u32(coord_off[2])})};
120 std::array<u32, 3> mod_coord{
121 u32(coord_off[0]) % 2,
122 u32(coord_off[1]) % 2,
123 u32(coord_off[2]) % 2,
126 std::array<i32, 3> block_pos_offset{
127 (0b100 & st.neighbourgh_state) >> 2,
128 (0b010 & st.neighbourgh_state) >> 1,
129 (0b001 & st.neighbourgh_state) >> 0,
132 block_pos_offset[0] *= AMRBlock::side_size / 2;
133 block_pos_offset[1] *= AMRBlock::side_size / 2;
134 block_pos_offset[2] *= AMRBlock::side_size / 2;
137 block_pos_offset[0] + (coord_off[0] / 2),
138 block_pos_offset[1] + (coord_off[1] / 2),
139 block_pos_offset[2] + (coord_off[2] / 2),
143 = cell::Levelm1::STATE(mod_coord[0] * 4 + mod_coord[1] * 2 + mod_coord[2]);
147 st.block_idx * AMRBlock::block_size
149 {
u32(coord_off[0]),
u32(coord_off[1]),
u32(coord_off[2])})};
152 std::array<u32, 3> mod_coord{
153 u32(coord_off[0] / (AMRBlock::side_size / 2)),
154 u32(coord_off[1] / (AMRBlock::side_size / 2)),
155 u32(coord_off[2] / (AMRBlock::side_size / 2)),
157 u32 child_select = mod_coord[0] * 4 + mod_coord[1] * 2 + mod_coord[2];
160 = {int((coord_off[0] * 2) % AMRBlock::side_size),
161 int((coord_off[1] * 2) % AMRBlock::side_size),
162 int((coord_off[2] * 2) % AMRBlock::side_size)};
164 u32 idx_tmp = st.block_child_idxs[child_select] * AMRBlock::block_size
166 {
u32(coord_off[0]),
u32(coord_off[1]),
u32(coord_off[2])});
170 [&](block::StencilElement::None st) {
171 return cell::StencilElement::None{};