71 struct Hierarchical_HVOL_TET_Functor
73 using ExecutionSpace =
typename DeviceType::execution_space;
74 using ScratchSpace =
typename ExecutionSpace::scratch_memory_space;
75 using OutputScratchView = Kokkos::View<OutputScalar*,ScratchSpace,Kokkos::MemoryTraits<Kokkos::Unmanaged>>;
76 using PointScratchView = Kokkos::View<PointScalar*, ScratchSpace,Kokkos::MemoryTraits<Kokkos::Unmanaged>>;
78 using TeamPolicy = Kokkos::TeamPolicy<ExecutionSpace>;
79 using TeamMember =
typename TeamPolicy::member_type;
83 OutputFieldType output_;
84 InputPointsType inputPoints_;
87 int numFields_, numPoints_;
89 size_t fad_size_output_;
91 Hierarchical_HVOL_TET_Functor(EOperator opType, OutputFieldType output, InputPointsType inputPoints,
int polyOrder)
92 : opType_(opType), output_(output), inputPoints_(inputPoints),
93 polyOrder_(polyOrder),
96 numFields_ = output.extent_int(0);
97 numPoints_ = output.extent_int(1);
98 INTREPID2_TEST_FOR_EXCEPTION(numPoints_ != inputPoints.extent_int(0), std::invalid_argument,
"point counts need to match!");
99 INTREPID2_TEST_FOR_EXCEPTION(numFields_ != (polyOrder_+1)*(polyOrder_+2)*(polyOrder_+3)/6, std::invalid_argument,
"output field size does not match basis cardinality");
102 KOKKOS_INLINE_FUNCTION
103 void operator()(
const TeamMember & teamMember )
const
115 auto pointOrdinal = teamMember.league_rank();
116 OutputScratchView P, P_2p1, P_2ipjp1;
117 if (fad_size_output_ > 0) {
118 P = OutputScratchView(teamMember.team_shmem(), polyOrder_ + 1, fad_size_output_);
119 P_2p1 = OutputScratchView(teamMember.team_shmem(), polyOrder_ + 1, fad_size_output_);
120 P_2ipjp1 = OutputScratchView(teamMember.team_shmem(), polyOrder_ + 1, fad_size_output_);
123 P = OutputScratchView(teamMember.team_shmem(), polyOrder_ + 1);
124 P_2p1 = OutputScratchView(teamMember.team_shmem(), polyOrder_ + 1);
125 P_2ipjp1 = OutputScratchView(teamMember.team_shmem(), polyOrder_ + 1);
128 const auto & x = inputPoints_(pointOrdinal,0);
129 const auto & y = inputPoints_(pointOrdinal,1);
130 const auto & z = inputPoints_(pointOrdinal,2);
133 const PointScalar lambda[4] = {1. - x - y - z, x, y, z};
141 const PointScalar tLegendre = lambda[0] + lambda[1];
144 int fieldOrdinalOffset = 0;
149 const int min_ij = min_i + min_j;
150 const int min_ijk = min_ij + min_k;
151 for (
int totalPolyOrder_ijk=min_ijk; totalPolyOrder_ijk <= polyOrder_; totalPolyOrder_ijk++)
153 for (
int totalPolyOrder_ij=min_ij; totalPolyOrder_ij <= totalPolyOrder_ijk-min_j; totalPolyOrder_ij++)
155 for (
int i=min_i; i <= totalPolyOrder_ij-min_j; i++)
157 const int j = totalPolyOrder_ij - i;
158 const int k = totalPolyOrder_ijk - totalPolyOrder_ij;
160 const double alpha1 = i * 2.0 + 1.;
161 const PointScalar tJacobi1 = lambda[0] + lambda[1] + lambda[2];
162 const PointScalar & xJacobi1 = lambda[2];
165 const double alpha2 = 2. * (i + j + 1.);
166 const PointScalar tJacobi2 = 1.0;
167 const PointScalar & xJacobi2 = lambda[3];
170 const auto & P_i = P(i);
171 const auto & P_2p1_j = P_2p1(j);
172 const auto & P_2ipjp1_k = P_2ipjp1(k);
174 output_(fieldOrdinalOffset,pointOrdinal) = P_i * P_2p1_j * P_2ipjp1_k;
175 fieldOrdinalOffset++;
191 size_t team_shmem_size (
int team_size)
const
194 size_t shmem_size = 0;
195 if (fad_size_output_ > 0)
196 shmem_size += 3 * OutputScratchView::shmem_size(polyOrder_ + 1, fad_size_output_);
198 shmem_size += 3 * OutputScratchView::shmem_size(polyOrder_ + 1);