70 struct Hierarchical_HVOL_TRI_Functor
72 using ExecutionSpace =
typename DeviceType::execution_space;
73 using ScratchSpace =
typename ExecutionSpace::scratch_memory_space;
74 using OutputScratchView = Kokkos::View<OutputScalar*,ScratchSpace,Kokkos::MemoryTraits<Kokkos::Unmanaged>>;
75 using PointScratchView = Kokkos::View<PointScalar*, ScratchSpace,Kokkos::MemoryTraits<Kokkos::Unmanaged>>;
77 using TeamPolicy = Kokkos::TeamPolicy<ExecutionSpace>;
78 using TeamMember =
typename TeamPolicy::member_type;
82 OutputFieldType output_;
83 InputPointsType inputPoints_;
86 int numFields_, numPoints_;
88 size_t fad_size_output_;
90 Hierarchical_HVOL_TRI_Functor(EOperator opType, OutputFieldType output, InputPointsType inputPoints,
int polyOrder)
91 : opType_(opType), output_(output), inputPoints_(inputPoints),
92 polyOrder_(polyOrder),
95 numFields_ = output.extent_int(0);
96 numPoints_ = output.extent_int(1);
97 INTREPID2_TEST_FOR_EXCEPTION(numPoints_ != inputPoints.extent_int(0), std::invalid_argument,
"point counts need to match!");
98 INTREPID2_TEST_FOR_EXCEPTION(numFields_ != (polyOrder_+1)*(polyOrder_+2)/2, std::invalid_argument,
"output field size does not match basis cardinality");
101 KOKKOS_INLINE_FUNCTION
102 void operator()(
const TeamMember & teamMember )
const
104 auto pointOrdinal = teamMember.league_rank();
105 OutputScratchView legendre_field_values_at_point, jacobi_values_at_point;
106 if (fad_size_output_ > 0) {
107 legendre_field_values_at_point = OutputScratchView(teamMember.team_shmem(), polyOrder_ + 1, fad_size_output_);
108 jacobi_values_at_point = OutputScratchView(teamMember.team_shmem(), polyOrder_ + 1, fad_size_output_);
111 legendre_field_values_at_point = OutputScratchView(teamMember.team_shmem(), polyOrder_ + 1);
112 jacobi_values_at_point = OutputScratchView(teamMember.team_shmem(), polyOrder_ + 1);
115 const auto & x = inputPoints_(pointOrdinal,0);
116 const auto & y = inputPoints_(pointOrdinal,1);
119 const PointScalar lambda[3] = {1. - x - y, x, y};
127 const PointScalar tLegendre = lambda[0] + lambda[1];
130 int fieldOrdinalOffset = 0;
131 const int max_ij_sum = polyOrder_;
132 for (
int ij_sum=0; ij_sum<=max_ij_sum; ij_sum++)
134 for (
int i=0; i<=ij_sum; i++)
136 const int j = ij_sum - i;
137 const auto & legendreValue = legendre_field_values_at_point(i);
138 const double alpha = i*2.0+1;
140 const PointScalar tJacobi = 1.0;
143 const auto & jacobiValue = jacobi_values_at_point(j);
144 output_(fieldOrdinalOffset,pointOrdinal) = legendreValue * jacobiValue;
145 fieldOrdinalOffset++;
160 size_t team_shmem_size (
int team_size)
const
164 size_t shmem_size = 0;
165 if (fad_size_output_ > 0)
166 shmem_size += 2 * OutputScratchView::shmem_size(polyOrder_ + 1, fad_size_output_);
168 shmem_size += 2 * OutputScratchView::shmem_size(polyOrder_ + 1);
KOKKOS_INLINE_FUNCTION void shiftedScaledJacobiValues(OutputValueViewType outputValues, double alpha, Intrepid2::ordinal_type n, ScalarType x, ScalarTypeForScaling t)
Shifted, scaled Jacobi values, defined for x in [0,1].