257 MemorySpace::Default::kokkos_space::execution_space>::member_type
259 const Kokkos::View<Number *, MemorySpace::Default::kokkos_space>
264#if KOKKOS_VERSION >= 40000
265 if constexpr (dim == 1)
266 apply_1d<n_q_points_1d, Number, direction, dof_to_quad, add, in_place>(
267 team_member, shape_data, in, out);
268 if constexpr (dim == 2)
269 apply_2d<n_q_points_1d, Number, direction, dof_to_quad, add, in_place>(
270 team_member, shape_data, in, out);
271 if constexpr (dim == 3)
272 apply_3d<n_q_points_1d, Number, direction, dof_to_quad, add, in_place>(
273 team_member, shape_data, in, out);
275 constexpr unsigned int n_q_points =
Utilities::pow(n_q_points_1d, dim);
277 Number t[n_q_points];
278 Kokkos::parallel_for(
279 Kokkos::TeamThreadRange(team_member, n_q_points),
280 [&](
const int &q_point) {
281 const unsigned int i = (dim == 1) ? 0 : q_point % n_q_points_1d;
282 const unsigned int j =
283 (dim == 3) ? (q_point / n_q_points_1d) % n_q_points_1d : 0;
284 const unsigned int q =
285 (dim == 1) ? q_point :
286 (dim == 2) ? (q_point / n_q_points_1d) % n_q_points_1d :
287 q_point / (n_q_points_1d * n_q_points_1d);
291 const int stride_shape = dof_to_quad ? n_q_points_1d : 1;
293 const int base_shape = dof_to_quad ? q : (q * n_q_points_1d);
295 (direction == 0) ? (n_q_points_1d * (i + n_q_points_1d * j)) :
296 (direction == 1) ? (i + n_q_points_1d * (n_q_points_1d * j)) :
297 (i + n_q_points_1d * j);
299 shape_data[base_shape] * (in_place ? out(base) : in(base));
300 for (
int k = 1; k < n_q_points_1d; ++k)
303 shape_data[base_shape + k * stride_shape] *
304 (in_place ? out(base + k * stride) : in(base + k * stride));
310 team_member.team_barrier();
312 Kokkos::parallel_for(
313 Kokkos::TeamThreadRange(team_member, n_q_points),
314 [&](
const int &q_point) {
315 const unsigned int i = (dim == 1) ? 0 : q_point % n_q_points_1d;
316 const unsigned int j =
317 (dim == 3) ? (q_point / n_q_points_1d) % n_q_points_1d : 0;
318 const unsigned int q =
319 (dim == 1) ? q_point :
320 (dim == 2) ? (q_point / n_q_points_1d) % n_q_points_1d :
321 q_point / (n_q_points_1d * n_q_points_1d);
323 const unsigned int destination_idx =
324 (direction == 0) ? (q + n_q_points_1d * (i + n_q_points_1d * j)) :
325 (direction == 1) ? (i + n_q_points_1d * (q + n_q_points_1d * j)) :
326 (i + n_q_points_1d * (j + n_q_points_1d * q));
329 Kokkos::atomic_add(&out(destination_idx), t[q_point]);
331 out(destination_idx) = t[q_point];
369 MemorySpace::Default::kokkos_space::execution_space>::member_type;
374 Kokkos::View<Number *, MemorySpace::Default::kokkos_space> shape_values,
375 Kokkos::View<Number *, MemorySpace::Default::kokkos_space>
377 Kokkos::View<Number *, MemorySpace::Default::kokkos_space>
383 template <
typename ViewType>
385 evaluate_values(ViewType u);
391 template <
typename ViewTypeIn,
typename ViewTypeOut>
393 evaluate_gradients(
const ViewTypeIn u, ViewTypeOut grad_u);
399 template <
typename ViewType1,
typename ViewType2>
401 evaluate_values_and_gradients(ViewType1 u, ViewType2 grad_u);
406 template <
typename ViewType>
408 integrate_values(ViewType u);
414 template <
bool add,
typename ViewType1,
typename ViewType2>
416 integrate_gradients(ViewType1 u, ViewType2 grad_u);
422 template <
typename ViewType1,
typename ViewType2>
424 integrate_values_and_gradients(ViewType1 u, ViewType2 grad_u);
430 template <
int direction,
435 typename ViewTypeOut>
437 values(
const ViewTypeIn in, ViewTypeOut out)
const;
443 template <
int direction,
448 typename ViewTypeOut>
450 gradients(
const ViewTypeIn in, ViewTypeOut out)
const;
457 template <
int direction,
462 typename ViewTypeOut>
464 co_gradients(
const ViewTypeIn in, ViewTypeOut out)
const;
474 Kokkos::View<Number *, MemorySpace::Default::kokkos_space>
shape_values;
479 Kokkos::View<Number *, MemorySpace::Default::kokkos_space>
485 Kokkos::View<Number *, MemorySpace::Default::kokkos_space>
583 Number>::evaluate_values(ViewType u)
585 if constexpr (dim == 1)
586 values<0, true, false, true>(u, u);
587 else if constexpr (dim == 2)
589 values<0, true, false, true>(u, u);
590 team_member.team_barrier();
591 values<1, true, false, true>(u, u);
593 else if constexpr (dim == 3)
595 values<0, true, false, true>(u, u);
596 team_member.team_barrier();
597 values<1, true, false, true>(u, u);
598 team_member.team_barrier();
599 values<2, true, false, true>(u, u);
602 Kokkos::abort(
"dim must not exceed 3!");
614 Number>::integrate_values(ViewType u)
616 if constexpr (dim == 1)
617 values<0, false, false, true>(u, u);
618 else if constexpr (dim == 2)
620 values<0, false, false, true>(u, u);
621 team_member.team_barrier();
622 values<1, false, false, true>(u, u);
624 else if constexpr (dim == 3)
626 values<0, false, false, true>(u, u);
627 team_member.team_barrier();
628 values<1, false, false, true>(u, u);
629 team_member.team_barrier();
630 values<2, false, false, true>(u, u);
633 Kokkos::abort(
"dim must not exceed 3!");
645 Number>::evaluate_gradients(
const ViewTypeIn u,
648 if constexpr (dim == 1)
650 gradients<0, true, false, false>(
651 u, Kokkos::subview(grad_u, Kokkos::ALL, 0));
653 else if constexpr (dim == 2)
655 gradients<0, true, false, false>(
656 u, Kokkos::subview(grad_u, Kokkos::ALL, 0));
657 values<0, true, false, false>(
658 u, Kokkos::subview(grad_u, Kokkos::ALL, 1));
660 team_member.team_barrier();
662 values<1, true, false, true>(Kokkos::subview(grad_u, Kokkos::ALL, 0),
663 Kokkos::subview(grad_u, Kokkos::ALL, 0));
664 gradients<1, true, false, true>(
665 Kokkos::subview(grad_u, Kokkos::ALL, 1),
666 Kokkos::subview(grad_u, Kokkos::ALL, 1));
668 else if constexpr (dim == 3)
670 gradients<0, true, false, false>(
671 u, Kokkos::subview(grad_u, Kokkos::ALL, 0));
672 values<0, true, false, false>(
673 u, Kokkos::subview(grad_u, Kokkos::ALL, 1));
674 values<0, true, false, false>(
675 u, Kokkos::subview(grad_u, Kokkos::ALL, 2));
677 team_member.team_barrier();
679 values<1, true, false, true>(Kokkos::subview(grad_u, Kokkos::ALL, 0),
680 Kokkos::subview(grad_u, Kokkos::ALL, 0));
681 gradients<1, true, false, true>(
682 Kokkos::subview(grad_u, Kokkos::ALL, 1),
683 Kokkos::subview(grad_u, Kokkos::ALL, 1));
684 values<1, true, false, true>(Kokkos::subview(grad_u, Kokkos::ALL, 2),
685 Kokkos::subview(grad_u, Kokkos::ALL, 2));
687 team_member.team_barrier();
689 values<2, true, false, true>(Kokkos::subview(grad_u, Kokkos::ALL, 0),
690 Kokkos::subview(grad_u, Kokkos::ALL, 0));
691 values<2, true, false, true>(Kokkos::subview(grad_u, Kokkos::ALL, 1),
692 Kokkos::subview(grad_u, Kokkos::ALL, 1));
693 gradients<2, true, false, true>(
694 Kokkos::subview(grad_u, Kokkos::ALL, 2),
695 Kokkos::subview(grad_u, Kokkos::ALL, 2));
698 Kokkos::abort(
"dim must not exceed 3!");
710 Number>::evaluate_values_and_gradients(ViewType1 u,
714 if constexpr (dim == 1)
716 values<0, true, false, true>(u, u);
717 team_member.team_barrier();
719 co_gradients<0, true, false, false>(
720 u, Kokkos::subview(grad_u, Kokkos::ALL, 0));
722 else if constexpr (dim == 2)
724 values<0, true, false, true>(u, u);
725 team_member.team_barrier();
726 values<1, true, false, true>(u, u);
727 team_member.team_barrier();
729 co_gradients<0, true, false, false>(
730 u, Kokkos::subview(grad_u, Kokkos::ALL, 0));
731 co_gradients<1, true, false, false>(
732 u, Kokkos::subview(grad_u, Kokkos::ALL, 1));
734 else if constexpr (dim == 3)
736 values<0, true, false, true>(u, u);
737 team_member.team_barrier();
738 values<1, true, false, true>(u, u);
739 team_member.team_barrier();
740 values<2, true, false, true>(u, u);
741 team_member.team_barrier();
743 co_gradients<0, true, false, false>(
744 u, Kokkos::subview(grad_u, Kokkos::ALL, 0));
745 co_gradients<1, true, false, false>(
746 u, Kokkos::subview(grad_u, Kokkos::ALL, 1));
747 co_gradients<2, true, false, false>(
748 u, Kokkos::subview(grad_u, Kokkos::ALL, 2));
751 Kokkos::abort(
"dim must not exceed 3!");
763 Number>::integrate_gradients(ViewType1 u,
766 if constexpr (dim == 1)
768 gradients<0, false, add, false>(
769 Kokkos::subview(grad_u, Kokkos::ALL, dim), u);
771 else if constexpr (dim == 2)
773 gradients<0, false, false, true>(
774 Kokkos::subview(grad_u, Kokkos::ALL, 0),
775 Kokkos::subview(grad_u, Kokkos::ALL, 0));
776 values<0, false, false, true>(Kokkos::subview(grad_u, Kokkos::ALL, 1),
777 Kokkos::subview(grad_u,
781 team_member.team_barrier();
783 values<1, false, add, false>(Kokkos::subview(grad_u, Kokkos::ALL, 0),
785 team_member.team_barrier();
786 gradients<1, false, true, false>(
787 Kokkos::subview(grad_u, Kokkos::ALL, 1), u);
789 else if constexpr (dim == 3)
791 gradients<0, false, false, true>(
792 Kokkos::subview(grad_u, Kokkos::ALL, 0),
793 Kokkos::subview(grad_u, Kokkos::ALL, 0));
794 values<0, false, false, true>(Kokkos::subview(grad_u, Kokkos::ALL, 1),
795 Kokkos::subview(grad_u,
798 values<0, false, false, true>(Kokkos::subview(grad_u, Kokkos::ALL, 2),
799 Kokkos::subview(grad_u,
803 team_member.team_barrier();
805 values<1, false, false, true>(Kokkos::subview(grad_u, Kokkos::ALL, 0),
806 Kokkos::subview(grad_u,
809 gradients<1, false, false, true>(
810 Kokkos::subview(grad_u, Kokkos::ALL, 1),
811 Kokkos::subview(grad_u, Kokkos::ALL, 1));
812 values<1, false, false, true>(Kokkos::subview(grad_u, Kokkos::ALL, 2),
813 Kokkos::subview(grad_u,
817 team_member.team_barrier();
819 values<2, false, add, false>(Kokkos::subview(grad_u, Kokkos::ALL, 0),
821 team_member.team_barrier();
822 values<2, false, true, false>(Kokkos::subview(grad_u, Kokkos::ALL, 1),
824 team_member.team_barrier();
825 gradients<2, false, true, false>(
826 Kokkos::subview(grad_u, Kokkos::ALL, 2), u);
829 Kokkos::abort(
"dim must not exceed 3!");
841 Number>::integrate_values_and_gradients(ViewType1 u,
845 if constexpr (dim == 1)
847 co_gradients<0, false, true, false>(
848 Kokkos::subview(grad_u, Kokkos::ALL, 0), u);
849 team_member.team_barrier();
851 values<0, false, false, true>(u, u);
853 else if constexpr (dim == 2)
855 co_gradients<1, false, true, false>(
856 Kokkos::subview(grad_u, Kokkos::ALL, 1), u);
857 team_member.team_barrier();
858 co_gradients<0, false, true, false>(
859 Kokkos::subview(grad_u, Kokkos::ALL, 0), u);
860 team_member.team_barrier();
862 values<1, false, false, true>(u, u);
863 team_member.team_barrier();
864 values<0, false, false, true>(u, u);
865 team_member.team_barrier();
867 else if constexpr (dim == 3)
869 co_gradients<2, false, true, false>(
870 Kokkos::subview(grad_u, Kokkos::ALL, 2), u);
871 team_member.team_barrier();
872 co_gradients<1, false, true, false>(
873 Kokkos::subview(grad_u, Kokkos::ALL, 1), u);
874 team_member.team_barrier();
875 co_gradients<0, false, true, false>(
876 Kokkos::subview(grad_u, Kokkos::ALL, 0), u);
877 team_member.team_barrier();
879 values<2, false, false, true>(u, u);
880 team_member.team_barrier();
881 values<1, false, false, true>(u, u);
882 team_member.team_barrier();
883 values<0, false, false, true>(u, u);
884 team_member.team_barrier();
887 Kokkos::abort(
"dim must not exceed 3!");