| 10 | |
| 11 | template <typename T> |
| 12 | void test_array4 (Array4<T> const& a, T tot) |
| 13 | { |
| 14 | ReduceOps<ReduceOpSum> reduce_op; |
| 15 | ReduceData<T> reduce_data(reduce_op); |
| 16 | using ReduceTuple = typename decltype(reduce_data)::Type; |
| 17 | Box box(IntVectShrink<AMREX_SPACEDIM,4>(a.begin), |
| 18 | IntVectShrink<AMREX_SPACEDIM,4>(a.end-1)); |
| 19 | if (a.nComp() == 1) { |
| 20 | reduce_op.eval(box, reduce_data, |
| 21 | [=] AMREX_GPU_DEVICE (int i, int j, int k) -> ReduceTuple |
| 22 | { |
| 23 | auto v0 = a(i,j,k); |
| 24 | auto v1 = a(i,j,k,0); |
| 25 | auto v2 = a(IntVectND<4>(i,j,k,0)); |
| 26 | auto v3 = a(IntVect(AMREX_D_DECL(i,j,k))); |
| 27 | auto v4 = a(Dim3{.x = i, .y = j, .z = k}); |
| 28 | auto* p0 = a.ptr(i,j,k); |
| 29 | auto* p1 = a.ptr(i,j,k,0); |
| 30 | auto* p2 = a.ptr(IntVectND<4>(i,j,k,0)); |
| 31 | auto* p3 = a.ptr(IntVect(AMREX_D_DECL(i,j,k))); |
| 32 | auto* p4 = a.ptr(Dim3{.x = i, .y = j, .z = k}); |
| 33 | return (v0+v1+v2+v3+v4+*p0+*p1+*p2+*p3+*p4)/10; |
| 34 | }); |
| 35 | } else { |
| 36 | reduce_op.eval(box, a.nComp(), reduce_data, |
| 37 | [=] AMREX_GPU_DEVICE (int i, int j, int k, int n) -> ReduceTuple |
| 38 | { |
| 39 | auto v0 = a(i,j,k,n); |
| 40 | auto v1 = a(IntVect(AMREX_D_DECL(i,j,k)),n); |
| 41 | auto v2 = a(Dim3{.x = i, .y = j, .z = k},n); |
| 42 | auto* p0 = a.ptr(i,j,k,n); |
| 43 | auto* p1 = a.ptr(IntVect(AMREX_D_DECL(i,j,k)),n); |
| 44 | auto* p2 = a.ptr(Dim3{.x = i, .y = j, .z = k},n); |
| 45 | return (v0+v1+v2+*p0+*p1+*p2)/6; |
| 46 | }); |
| 47 | } |
| 48 | ReduceTuple hv = reduce_data.value(reduce_op); |
| 49 | AMREX_ALWAYS_ASSERT(tot == amrex::get<0>(hv)); |
| 50 | } |
| 51 | |
| 52 | template <typename T, int N> |
| 53 | void test_comp (ArrayND<T,N,true> const& a, T tot) |