71 using ExecutionSpace =
typename DeviceType::execution_space;
72 using ScratchSpace =
typename ExecutionSpace::scratch_memory_space;
73 using OutputScratchView = Kokkos::View<OutputScalar*,ScratchSpace,Kokkos::MemoryTraits<Kokkos::Unmanaged>>;
74 using PointScratchView = Kokkos::View<PointScalar*, ScratchSpace,Kokkos::MemoryTraits<Kokkos::Unmanaged>>;
76 using TeamPolicy = Kokkos::TeamPolicy<ExecutionSpace>;
77 using TeamMember =
typename TeamPolicy::member_type;
81 OutputFieldType output_;
82 InputPointsType inputPoints_;
85 bool defineVertexFunctions_;
86 int numFields_, numPoints_;
88 size_t fad_size_output_;
91 int polyOrder,
bool defineVertexFunctions)
92 : opType_(opType), output_(output), inputPoints_(inputPoints),
93 polyOrder_(polyOrder), defineVertexFunctions_(defineVertexFunctions),
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, std::invalid_argument,
"output field size does not match basis cardinality");
102 KOKKOS_INLINE_FUNCTION
103 void operator()(
const TeamMember & teamMember )
const
105 auto pointOrdinal = teamMember.league_rank();
106 OutputScratchView field_values_at_point;
107 if (fad_size_output_ > 0) {
108 field_values_at_point = OutputScratchView(teamMember.team_shmem(), numFields_, fad_size_output_);
111 field_values_at_point = OutputScratchView(teamMember.team_shmem(), numFields_);
114 const auto & input_x = inputPoints_(pointOrdinal,0);
115 const bool taking_derivative = (opType_ != OPERATOR_VALUE);
116 const bool callingShiftedScaledLegendre = (opType_ == OPERATOR_VALUE) || (opType_ == OPERATOR_GRAD) || (opType_ == OPERATOR_D1);
119 const PointScalar x = callingShiftedScaledLegendre ? PointScalar((input_x + 1.0)/2.0) : PointScalar(input_x);
120 const double legendreScaling = 1.0;
121 const double outputScaling = taking_derivative ? 0.5 : 1.0;
128 Polynomials::shiftedScaledIntegratedLegendreValues(field_values_at_point, polyOrder_, x, legendreScaling);
133 if (defineVertexFunctions_)
135 field_values_at_point(0) = 1. - x;
136 field_values_at_point(1) = x;
143 Polynomials::shiftedScaledIntegratedLegendreValues_dx(field_values_at_point, polyOrder_, x, legendreScaling);
148 if (defineVertexFunctions_)
150 field_values_at_point(0) = -1.0;
151 field_values_at_point(1) = 1.0;
165 Polynomials::legendreDerivativeValues(field_values_at_point, polyOrder_, x, derivativeOrder);
170 OutputScalar Pn_minus_one = field_values_at_point(1);
171 for (
int fieldOrdinal=2; fieldOrdinal<numFields_; fieldOrdinal++)
173 OutputScalar Pn = field_values_at_point(fieldOrdinal);
174 field_values_at_point(fieldOrdinal) = Pn_minus_one;
178 if (numFields_ >= 1) field_values_at_point(0) = 0.0;
179 if (numFields_ >= 2) field_values_at_point(1) = 0.0;
187 device_assert(
false);
191 for (
int fieldOrdinal=0; fieldOrdinal<numFields_; fieldOrdinal++)
194 output_.access(fieldOrdinal,pointOrdinal,0) = outputScaling * field_values_at_point(fieldOrdinal);
201 size_t team_shmem_size (
int team_size)
const
204 size_t shmem_size = 0;
205 if (fad_size_output_ > 0)
206 shmem_size += OutputScratchView::shmem_size(numFields_, fad_size_output_);
208 shmem_size += OutputScratchView::shmem_size(numFields_);
void setOrdinalTagData(OrdinalTypeView3D &tagToOrdinal, OrdinalTypeView2D &ordinalToTag, const OrdinalTypeView1D tags, const ordinal_type basisCard, const ordinal_type tagSize, const ordinal_type posScDim, const ordinal_type posScOrd, const ordinal_type posDfOrd)
Fills ordinalToTag_ and tagToOrdinal_ by basis-specific tag data.