37 struct Hierarchical_HVOL_TET_Functor
39 using ExecutionSpace =
typename DeviceType::execution_space;
40 using ScratchSpace =
typename ExecutionSpace::scratch_memory_space;
41 using OutputScratchView = Kokkos::View<OutputScalar*,ScratchSpace,Kokkos::MemoryTraits<Kokkos::Unmanaged>>;
42 using PointScratchView = Kokkos::View<PointScalar*, ScratchSpace,Kokkos::MemoryTraits<Kokkos::Unmanaged>>;
44 using TeamPolicy = Kokkos::TeamPolicy<ExecutionSpace>;
45 using TeamMember =
typename TeamPolicy::member_type;
49 OutputFieldType output_;
50 InputPointsType inputPoints_;
53 int numFields_, numPoints_;
55 size_t fad_size_output_;
57 Hierarchical_HVOL_TET_Functor(EOperator opType, OutputFieldType output, InputPointsType inputPoints,
int polyOrder)
58 : opType_(opType), output_(output), inputPoints_(inputPoints),
59 polyOrder_(polyOrder),
62 numFields_ = output.extent_int(0);
63 numPoints_ = output.extent_int(1);
64 INTREPID2_TEST_FOR_EXCEPTION(numPoints_ != inputPoints.extent_int(0), std::invalid_argument,
"point counts need to match!");
65 INTREPID2_TEST_FOR_EXCEPTION(numFields_ != (polyOrder_+1)*(polyOrder_+2)*(polyOrder_+3)/6, std::invalid_argument,
"output field size does not match basis cardinality");
68 KOKKOS_INLINE_FUNCTION
69 void operator()(
const TeamMember & teamMember )
const
81 auto pointOrdinal = teamMember.league_rank();
82 OutputScratchView P, P_2p1, P_2ipjp1;
83 if (fad_size_output_ > 0) {
84 P = OutputScratchView(teamMember.team_shmem(), polyOrder_ + 1, fad_size_output_);
85 P_2p1 = OutputScratchView(teamMember.team_shmem(), polyOrder_ + 1, fad_size_output_);
86 P_2ipjp1 = OutputScratchView(teamMember.team_shmem(), polyOrder_ + 1, fad_size_output_);
89 P = OutputScratchView(teamMember.team_shmem(), polyOrder_ + 1);
90 P_2p1 = OutputScratchView(teamMember.team_shmem(), polyOrder_ + 1);
91 P_2ipjp1 = OutputScratchView(teamMember.team_shmem(), polyOrder_ + 1);
94 const auto & x = inputPoints_(pointOrdinal,0);
95 const auto & y = inputPoints_(pointOrdinal,1);
96 const auto & z = inputPoints_(pointOrdinal,2);
99 const PointScalar lambda[4] = {1. - x - y - z, x, y, z};
107 const PointScalar tLegendre = lambda[0] + lambda[1];
110 int fieldOrdinalOffset = 0;
115 const int min_ij = min_i + min_j;
116 const int min_ijk = min_ij + min_k;
117 for (
int totalPolyOrder_ijk=min_ijk; totalPolyOrder_ijk <= polyOrder_; totalPolyOrder_ijk++)
119 for (
int totalPolyOrder_ij=min_ij; totalPolyOrder_ij <= totalPolyOrder_ijk-min_j; totalPolyOrder_ij++)
121 for (
int i=min_i; i <= totalPolyOrder_ij-min_j; i++)
123 const int j = totalPolyOrder_ij - i;
124 const int k = totalPolyOrder_ijk - totalPolyOrder_ij;
126 const double alpha1 = i * 2.0 + 1.;
127 const PointScalar tJacobi1 = lambda[0] + lambda[1] + lambda[2];
128 const PointScalar & xJacobi1 = lambda[2];
131 const double alpha2 = 2. * (i + j + 1.);
132 const PointScalar tJacobi2 = 1.0;
133 const PointScalar & xJacobi2 = lambda[3];
136 const auto & P_i = P(i);
137 const auto & P_2p1_j = P_2p1(j);
138 const auto & P_2ipjp1_k = P_2ipjp1(k);
140 output_(fieldOrdinalOffset,pointOrdinal) = P_i * P_2p1_j * P_2ipjp1_k;
141 fieldOrdinalOffset++;
157 size_t team_shmem_size (
int team_size)
const
160 size_t shmem_size = 0;
161 if (fad_size_output_ > 0)
162 shmem_size += 3 * OutputScratchView::shmem_size(polyOrder_ + 1, fad_size_output_);
164 shmem_size += 3 * OutputScratchView::shmem_size(polyOrder_ + 1);