16#ifndef __INTREPID2_HCURL_HEX_IN_FEM_DEF_HPP__
17#define __INTREPID2_HCURL_HEX_IN_FEM_DEF_HPP__
24 template<EOperator OpType>
25 template<
typename OutputViewType,
26 typename InputViewType,
27 typename WorkViewType,
28 typename VinvViewType>
29 KOKKOS_INLINE_FUNCTION
33 const InputViewType input,
35 const VinvViewType vinvLine,
36 const VinvViewType vinvBubble) {
37 const ordinal_type cardLine = vinvLine.extent(0);
38 const ordinal_type cardBubble = vinvBubble.extent(0);
40 const ordinal_type npts = input.extent(0);
42 typedef Kokkos::pair<ordinal_type,ordinal_type> range_type;
43 const auto input_x = Kokkos::subview(input, Kokkos::ALL(), range_type(0,1));
44 const auto input_y = Kokkos::subview(input, Kokkos::ALL(), range_type(1,2));
45 const auto input_z = Kokkos::subview(input, Kokkos::ALL(), range_type(2,3));
47 const ordinal_type dim_s = get_dimension_scalar(input);
48 auto ptr0 = work.data();
49 auto ptr1 = work.data() + cardLine*npts*dim_s;
50 auto ptr2 = work.data() + 2*cardLine*npts*dim_s;
51 auto ptr3 = work.data() + 3*cardLine*npts*dim_s;
53 typedef typename Kokkos::DynRankView<typename InputViewType::value_type, typename WorkViewType::memory_space> ViewType;
56 case OPERATOR_VALUE: {
66 Impl::Basis_HGRAD_LINE_Cn_FEM::Serial<OPERATOR_VALUE>::
67 getValues(outputBubble, input_x, workLine, vinvBubble);
69 Impl::Basis_HGRAD_LINE_Cn_FEM::Serial<OPERATOR_VALUE>::
70 getValues(outputLine_A, input_y, workLine, vinvLine);
72 Impl::Basis_HGRAD_LINE_Cn_FEM::Serial<OPERATOR_VALUE>::
73 getValues(outputLine_B, input_z, workLine, vinvLine);
76 const auto output_x = outputBubble;
77 const auto output_y = outputLine_A;
78 const auto output_z = outputLine_B;
80 for (ordinal_type k=0;k<cardLine;++k)
81 for (ordinal_type j=0;j<cardLine;++j)
82 for (ordinal_type i=0;i<cardBubble;++i,++idx)
83 for (ordinal_type l=0;l<npts;++l) {
84 output.access(idx,l,0) = output_x.access(i,l)*output_y.access(j,l)*output_z.access(k,l);
85 output.access(idx,l,1) = 0.0;
86 output.access(idx,l,2) = 0.0;
90 Impl::Basis_HGRAD_LINE_Cn_FEM::Serial<OPERATOR_VALUE>::
91 getValues(outputLine_A, input_x, workLine, vinvLine);
93 Impl::Basis_HGRAD_LINE_Cn_FEM::Serial<OPERATOR_VALUE>::
94 getValues(outputBubble, input_y, workLine, vinvBubble);
100 const auto output_x = outputLine_A;
101 const auto output_y = outputBubble;
102 const auto output_z = outputLine_B;
104 for (ordinal_type k=0;k<cardLine;++k)
105 for (ordinal_type j=0;j<cardBubble;++j)
106 for (ordinal_type i=0;i<cardLine;++i,++idx)
107 for (ordinal_type l=0;l<npts;++l) {
108 output.access(idx,l,0) = 0.0;
109 output.access(idx,l,1) = output_x.access(i,l)*output_y.access(j,l)*output_z.access(k,l);
110 output.access(idx,l,2) = 0.0;
117 Impl::Basis_HGRAD_LINE_Cn_FEM::Serial<OPERATOR_VALUE>::
118 getValues(outputLine_B, input_y, workLine, vinvLine);
120 Impl::Basis_HGRAD_LINE_Cn_FEM::Serial<OPERATOR_VALUE>::
121 getValues(outputBubble, input_z, workLine, vinvBubble);
124 const auto output_x = outputLine_A;
125 const auto output_y = outputLine_B;
126 const auto output_z = outputBubble;
128 for (ordinal_type k=0;k<cardBubble;++k)
129 for (ordinal_type j=0;j<cardLine;++j)
130 for (ordinal_type i=0;i<cardLine;++i,++idx)
131 for (ordinal_type l=0;l<npts;++l) {
132 output.access(idx,l,0) = 0.0;
133 output.access(idx,l,1) = 0.0;
134 output.access(idx,l,2) = output_x.access(i,l)*output_y.access(j,l)*output_z.access(k,l);
139 case OPERATOR_CURL: {
141 auto ptr4 = work.data() + 4*cardLine*npts*dim_s;
142 auto ptr5 = work.data() + 5*cardLine*npts*dim_s;
152 ordinal_type idx = 0;
155 Impl::Basis_HGRAD_LINE_Cn_FEM::Serial<OPERATOR_VALUE>::
156 getValues(outputBubble, input_x, workLine, vinvBubble);
158 Impl::Basis_HGRAD_LINE_Cn_FEM::Serial<OPERATOR_VALUE>::
159 getValues(outputLine_A, input_y, workLine, vinvLine);
161 Impl::Basis_HGRAD_LINE_Cn_FEM::Serial<OPERATOR_Dn>::
162 getValues(outputLine_DA, input_y, workLine, vinvLine, 1);
164 Impl::Basis_HGRAD_LINE_Cn_FEM::Serial<OPERATOR_VALUE>::
165 getValues(outputLine_B, input_z, workLine, vinvLine);
167 Impl::Basis_HGRAD_LINE_Cn_FEM::Serial<OPERATOR_Dn>::
168 getValues(outputLine_DB, input_z, workLine, vinvLine, 1);
171 const auto output_x = outputBubble;
172 const auto output_y = outputLine_A;
173 const auto output_dy = outputLine_DA;
174 const auto output_z = outputLine_B;
175 const auto output_dz = outputLine_DB;
177 for (ordinal_type k=0;k<cardLine;++k)
178 for (ordinal_type j=0;j<cardLine;++j)
179 for (ordinal_type i=0;i<cardBubble;++i,++idx)
180 for (ordinal_type l=0;l<npts;++l) {
181 output.access(idx,l,0) = 0.0;
182 output.access(idx,l,1) = output_x.access(i,l)*output_y.access (j,l) *output_dz.access(k,l,0);
183 output.access(idx,l,2) = -output_x.access(i,l)*output_dy.access(j,l,0)*output_z.access (k,l);
187 Impl::Basis_HGRAD_LINE_Cn_FEM::Serial<OPERATOR_VALUE>::
188 getValues(outputLine_A, input_x, workLine, vinvLine);
190 Impl::Basis_HGRAD_LINE_Cn_FEM::Serial<OPERATOR_Dn>::
191 getValues(outputLine_DA, input_x, workLine, vinvLine, 1);
193 Impl::Basis_HGRAD_LINE_Cn_FEM::Serial<OPERATOR_VALUE>::
194 getValues(outputBubble, input_y, workLine, vinvBubble);
203 const auto output_x = outputLine_A;
204 const auto output_dx = outputLine_DA;
205 const auto output_y = outputBubble;
206 const auto output_z = outputLine_B;
207 const auto output_dz = outputLine_DB;
209 for (ordinal_type k=0;k<cardLine;++k)
210 for (ordinal_type j=0;j<cardBubble;++j)
211 for (ordinal_type i=0;i<cardLine;++i,++idx)
212 for (ordinal_type l=0;l<npts;++l) {
213 output.access(idx,l,0) = -output_x.access (i,l) *output_y.access(j,l)*output_dz.access(k,l,0);
214 output.access(idx,l,1) = 0.0;
215 output.access(idx,l,2) = output_dx(i,l,0)*output_y.access(j,l)*output_z.access (k,l);
225 Impl::Basis_HGRAD_LINE_Cn_FEM::Serial<OPERATOR_VALUE>::
226 getValues(outputLine_B, input_y, workLine, vinvLine);
228 Impl::Basis_HGRAD_LINE_Cn_FEM::Serial<OPERATOR_Dn>::
229 getValues(outputLine_DB, input_y, workLine, vinvLine, 1);
231 Impl::Basis_HGRAD_LINE_Cn_FEM::Serial<OPERATOR_VALUE>::
232 getValues(outputBubble, input_z, workLine, vinvBubble);
235 const auto output_x = outputLine_A;
236 const auto output_dx = outputLine_DA;
237 const auto output_y = outputLine_B;
238 const auto output_dy = outputLine_DB;
239 const auto output_z = outputBubble;
241 for (ordinal_type k=0;k<cardBubble;++k)
242 for (ordinal_type j=0;j<cardLine;++j)
243 for (ordinal_type i=0;i<cardLine;++i,++idx)
244 for (ordinal_type l=0;l<npts;++l) {
245 output.access(idx,l,0) = output_x.access (i,l) *output_dy.access(j,l,0)*output_z.access(k,l);
246 output.access(idx,l,1) = -output_dx(i,l,0)*output_y.access (j,l) *output_z.access(k,l);
247 output.access(idx,l,2) = 0.0;
253 INTREPID2_TEST_FOR_ABORT(
true,
254 ">>> ERROR: (Intrepid2::Basis_HCURL_HEX_In_FEM::Serial::getValues) operator is not supported" );
258 template<
typename DT, ordinal_type numPtsPerEval,
259 typename outputValueValueType,
class ...outputValueProperties,
260 typename inputPointValueType,
class ...inputPointProperties,
261 typename vinvValueType,
class ...vinvProperties>
263 Basis_HCURL_HEX_In_FEM::
264 getValues( Kokkos::DynRankView<outputValueValueType,outputValueProperties...> outputValues,
265 const Kokkos::DynRankView<inputPointValueType, inputPointProperties...> inputPoints,
266 const Kokkos::DynRankView<vinvValueType, vinvProperties...> vinvLine,
267 const Kokkos::DynRankView<vinvValueType, vinvProperties...> vinvBubble,
268 const EOperator operatorType ) {
269 typedef Kokkos::DynRankView<outputValueValueType,outputValueProperties...> outputValueViewType;
270 typedef Kokkos::DynRankView<inputPointValueType, inputPointProperties...> inputPointViewType;
271 typedef Kokkos::DynRankView<vinvValueType, vinvProperties...> vinvViewType;
272 typedef typename ExecSpace<typename inputPointViewType::execution_space,typename DT::execution_space>::ExecSpaceType ExecSpaceType;
275 const auto loopSizeTmp1 = (inputPoints.extent(0)/numPtsPerEval);
276 const auto loopSizeTmp2 = (inputPoints.extent(0)%numPtsPerEval != 0);
277 const auto loopSize = loopSizeTmp1 + loopSizeTmp2;
278 Kokkos::RangePolicy<ExecSpaceType,Kokkos::Schedule<Kokkos::Static> > policy(0, loopSize);
282 const ordinal_type cardinality = outputValues.extent(0);
284 ordinal_type order = 0;
285 ordinal_type cardBubble;
286 ordinal_type cardLine;
288 cardBubble = Intrepid2::getPnCardinality<1>(order);
289 cardLine = Intrepid2::getPnCardinality<1>(++order);
292 switch (operatorType) {
293 case OPERATOR_VALUE: {
294 auto workSize = Serial<OPERATOR_VALUE>::getWorkSizePerPoint(order);
295 auto work =
createMatchingDynRankView(inputPoints,
"Basis_CURL_HEX_In_FEM::getValues::work", workSize, inputPoints.extent(0));
296 typedef Functor<outputValueViewType,inputPointViewType,vinvViewType,
decltype(work),
297 OPERATOR_VALUE,numPtsPerEval> FunctorType;
298 Kokkos::parallel_for( policy, FunctorType(outputValues, inputPoints, vinvLine, vinvBubble, work) );
301 case OPERATOR_CURL: {
302 auto workSize = Serial<OPERATOR_CURL>::getWorkSizePerPoint(order);
303 auto work =
createMatchingDynRankView(inputPoints,
"Basis_CURL_HEX_In_FEM::getValues::work", workSize, inputPoints.extent(0));
304 typedef Functor<outputValueViewType,inputPointViewType,vinvViewType,
decltype(work),
305 OPERATOR_CURL,numPtsPerEval> FunctorType;
306 Kokkos::parallel_for( policy, FunctorType(outputValues, inputPoints, vinvLine, vinvBubble, work) );
310 INTREPID2_TEST_FOR_EXCEPTION(
true , std::invalid_argument,
311 ">>> ERROR (Basis_HCURL_HEX_In_FEM): Operator type not implemented" );
320 template<
typename DT,
typename OT,
typename PT>
323 const EPointType pointType ) {
325 INTREPID2_TEST_FOR_EXCEPTION( !(pointType == POINTTYPE_EQUISPACED ||
326 pointType == POINTTYPE_WARPBLEND), std::invalid_argument,
327 ">>> ERROR (Basis_HCURL_HEX_In_FEM): pointType must be either equispaced or warpblend.");
337 this->
vinvLine_ = Kokkos::DynRankView<typename ScalarViewType::value_type,DT>(
"Hcurl::Hex::In::vinvLine", cardLine, cardLine);
338 this->vinvBubble_ = Kokkos::DynRankView<typename ScalarViewType::value_type,DT>(
"Hcurl::Hex::In::vinvBubble", cardBubble, cardBubble);
340 lineBasis.getVandermondeInverse(this->
vinvLine_);
341 bubbleBasis.getVandermondeInverse(this->vinvBubble_);
343 const ordinal_type spaceDim = 3;
355 const ordinal_type tagSize = 4;
356 const ordinal_type posScDim = 0;
357 const ordinal_type posScOrd = 1;
358 const ordinal_type posDfOrd = 2;
362 INTREPID2_TEST_FOR_EXCEPTION( order >
Parameters::MaxOrder, std::invalid_argument,
"polynomial order exceeds the max supported by this class");
366 ordinal_type tags[3*maxCardLine*maxCardLine*maxCardLine][4];
368 const ordinal_type edge_x[2][2] = { {0, 4}, {2, 6} };
369 const ordinal_type edge_y[2][2] = { {3, 7}, {1, 5} };
370 const ordinal_type edge_z[2][2] = { {8,11}, {9,10} };
372 const ordinal_type face_yz[2] = {3, 1};
373 const ordinal_type face_xz[2] = {0, 2};
374 const ordinal_type face_xy[2] = {4, 5};
377 ordinal_type idx = 0;
387 face_ndofs_per_direction = (cardLine-2)*cardBubble,
388 face_ndofs = 2*face_ndofs_per_direction,
389 intr_ndofs_per_direction = (cardLine-2)*(cardLine-2)*cardBubble,
390 intr_ndofs = 3*intr_ndofs_per_direction;
393 for (ordinal_type k=0;k<cardLine;++k) {
394 const auto tag_z = lineBasis.
getDofTag(k);
395 for (ordinal_type j=0;j<cardLine;++j) {
396 const auto tag_y = lineBasis.
getDofTag(j);
397 for (ordinal_type i=0;i<cardBubble;++i,++idx) {
398 const auto tag_x = bubbleBasis.
getDofTag(i);
400 if (tag_x(0) == 1 && tag_y(0) == 0 && tag_z(0) == 0) {
403 tags[idx][1] = edge_x[tag_y(1)][tag_z(1)];
404 tags[idx][2] = tag_x(2);
405 tags[idx][3] = tag_x(3);
406 }
else if (tag_x(0) == 1 && tag_y(0) == 0 && tag_z(0) == 1) {
409 tags[idx][1] = face_xz[tag_y(1)];
410 tags[idx][2] = tag_x(2) + tag_x(3)*tag_z(2);
411 tags[idx][3] = face_ndofs;
412 }
else if (tag_x(0) == 1 && tag_y(0) == 1 && tag_z(0) == 0) {
415 tags[idx][1] = face_xy[tag_z(1)];
416 tags[idx][2] = tag_x(2) + tag_x(3)*tag_y(2);
417 tags[idx][3] = face_ndofs;
422 tags[idx][2] = tag_x(2) + tag_x(3)*tag_y(2) + tag_x(3)*tag_y(3)*tag_z(2);
423 tags[idx][3] = intr_ndofs;
430 for (ordinal_type k=0;k<cardLine;++k) {
431 const auto tag_z = lineBasis.
getDofTag(k);
432 for (ordinal_type j=0;j<cardBubble;++j) {
433 const auto tag_y = bubbleBasis.
getDofTag(j);
434 for (ordinal_type i=0;i<cardLine;++i,++idx) {
435 const auto tag_x = lineBasis.
getDofTag(i);
437 if (tag_x(0) == 0 && tag_y(0) == 1 && tag_z(0) == 0) {
440 tags[idx][1] = edge_y[tag_x(1)][tag_z(1)];
441 tags[idx][2] = tag_y(2);
442 tags[idx][3] = tag_y(3);
443 }
else if (tag_x(0) == 0 && tag_y(0) == 1 && tag_z(0) == 1) {
446 tags[idx][1] = face_yz[tag_x(1)];
447 tags[idx][2] = tag_y(2) + tag_y(3)*tag_z(2);
448 tags[idx][3] = face_ndofs;
449 }
else if (tag_x(0) == 1 && tag_y(0) == 1 && tag_z(0) == 0) {
452 tags[idx][1] = face_xy[tag_z(1)];
453 tags[idx][2] = face_ndofs_per_direction + tag_x(2) + tag_x(3)*tag_y(2);
454 tags[idx][3] = face_ndofs;
459 tags[idx][2] = intr_ndofs_per_direction + tag_x(2) + tag_x(3)*tag_y(2) + tag_x(3)*tag_y(3)*tag_z(2);
460 tags[idx][3] = intr_ndofs;
467 for (ordinal_type k=0;k<cardBubble;++k) {
468 const auto tag_z = bubbleBasis.
getDofTag(k);
469 for (ordinal_type j=0;j<cardLine;++j) {
470 const auto tag_y = lineBasis.
getDofTag(j);
471 for (ordinal_type i=0;i<cardLine;++i,++idx) {
472 const auto tag_x = lineBasis.
getDofTag(i);
474 if (tag_x(0) == 0 && tag_y(0) == 0 && tag_z(0) == 1) {
477 tags[idx][1] = edge_z[tag_x(1)][tag_y(1)];
478 tags[idx][2] = tag_z(2);
479 tags[idx][3] = tag_z(3);
480 }
else if (tag_x(0) == 0 && tag_y(0) == 1 && tag_z(0) == 1) {
483 tags[idx][1] = face_yz[tag_x(1)];
484 tags[idx][2] = face_ndofs_per_direction + tag_y(2) + tag_y(3)*tag_z(2);
485 tags[idx][3] = face_ndofs;
486 }
else if (tag_x(0) == 1 && tag_y(0) == 0 && tag_z(0) == 1) {
489 tags[idx][1] = face_xz[tag_y(1)];
490 tags[idx][2] = face_ndofs_per_direction + tag_x(2) + tag_x(3)*tag_z(2);
491 tags[idx][3] = face_ndofs;
496 tags[idx][2] = 2*intr_ndofs_per_direction + tag_x(2) + tag_x(3)*tag_y(2) + tag_x(3)*tag_y(3)*tag_z(2);
497 tags[idx][3] = intr_ndofs;
503 INTREPID2_TEST_FOR_EXCEPTION( idx != this->
basisCardinality_ , std::runtime_error,
504 ">>> ERROR (Basis_HCURL_HEX_In_FEM): " \
505 "counted tag index is not same as cardinality." );
523 Kokkos::DynRankView<typename ScalarViewType::value_type,typename DT::execution_space::array_layout,Kokkos::HostSpace>
527 Kokkos::DynRankView<typename ScalarViewType::value_type,typename DT::execution_space::array_layout,Kokkos::HostSpace>
530 Kokkos::DynRankView<typename ScalarViewType::value_type,DT>
531 dofCoordsLine(
"dofCoordsLine", cardLine, 1),
532 dofCoordsBubble(
"dofCoordsBubble", cardBubble, 1);
535 auto dofCoordsLineHost = Kokkos::create_mirror_view(Kokkos::HostSpace(), dofCoordsLine);
536 Kokkos::deep_copy(dofCoordsLineHost, dofCoordsLine);
539 auto dofCoordsBubbleHost = Kokkos::create_mirror_view(Kokkos::HostSpace(), dofCoordsBubble);
540 Kokkos::deep_copy(dofCoordsBubbleHost, dofCoordsBubble);
543 ordinal_type idx = 0;
546 for (ordinal_type k=0;k<cardLine;++k) {
547 for (ordinal_type j=0;j<cardLine;++j) {
548 for (ordinal_type i=0;i<cardBubble;++i,++idx) {
549 dofCoordsHost(idx,0) = dofCoordsBubbleHost(i,0);
550 dofCoordsHost(idx,1) = dofCoordsLineHost(j,0);
551 dofCoordsHost(idx,2) = dofCoordsLineHost(k,0);
552 dofCoeffsHost(idx,0) = 1.0;
558 for (ordinal_type k=0;k<cardLine;++k) {
559 for (ordinal_type j=0;j<cardBubble;++j) {
560 for (ordinal_type i=0;i<cardLine;++i,++idx) {
561 dofCoordsHost(idx,0) = dofCoordsLineHost(i,0);
562 dofCoordsHost(idx,1) = dofCoordsBubbleHost(j,0);
563 dofCoordsHost(idx,2) = dofCoordsLineHost(k,0);
564 dofCoeffsHost(idx,1) = 1.0;
570 for (ordinal_type k=0;k<cardBubble;++k) {
571 for (ordinal_type j=0;j<cardLine;++j) {
572 for (ordinal_type i=0;i<cardLine;++i,++idx) {
573 dofCoordsHost(idx,0) = dofCoordsLineHost(i,0);
574 dofCoordsHost(idx,1) = dofCoordsLineHost(j,0);
575 dofCoordsHost(idx,2) = dofCoordsBubbleHost(k,0);
576 dofCoeffsHost(idx,2) = 1.0;
582 this->
dofCoords_ = Kokkos::create_mirror_view(
typename DT::memory_space(), dofCoordsHost);
583 Kokkos::deep_copy(this->
dofCoords_, dofCoordsHost);
585 this->
dofCoeffs_ = Kokkos::create_mirror_view(
typename DT::memory_space(), dofCoeffsHost);
586 Kokkos::deep_copy(this->
dofCoeffs_, dofCoeffsHost);
589 template<
typename DT,
typename OT,
typename PT>
591 Basis_HCURL_HEX_In_FEM<DT,OT,PT>::getScratchSpaceSize(
592 ordinal_type& perTeamSpaceSize,
593 ordinal_type& perThreadSpaceSize,
595 const EOperator operatorType)
const {
596 perTeamSpaceSize = 0;
597 ordinal_type scalarWorkViewExtent = (operatorType == OPERATOR_VALUE) ?
598 3*this->vinvLine_.extent(0)+this->vinvBubble_.extent(0):
599 5*this->vinvLine_.extent(0)+this->vinvBubble_.extent(0);
600 perThreadSpaceSize = scalarWorkViewExtent*get_dimension_scalar(inputPoints)*
sizeof(
typename BasisBase::scalarType);
603 template<
typename DT,
typename OT,
typename PT>
604 KOKKOS_INLINE_FUNCTION
606 Basis_HCURL_HEX_In_FEM<DT,OT,PT>::getValues(
607 OutputViewType outputValues,
608 const PointViewType inputPoints,
609 const EOperator operatorType,
610 const typename Kokkos::TeamPolicy<typename DT::execution_space>::member_type& team_member,
611 const typename DT::execution_space::scratch_memory_space & scratchStorage,
612 const ordinal_type subcellDim,
613 const ordinal_type subcellOrdinal)
const {
615 INTREPID2_TEST_FOR_ABORT( !((subcellDim == -1) && (subcellOrdinal == -1)),
616 ">>> ERROR: (Intrepid2::Basis_HCURL_HEX_In_FEM::getValues), The capability of selecting subsets of basis functions has not been implemented yet.");
618 const int numPoints = inputPoints.extent(0);
619 using ScalarType =
typename ScalarTraits<typename PointViewType::value_type>::scalar_type;
620 using WorkViewType = Kokkos::DynRankView< ScalarType,typename DT::execution_space::scratch_memory_space,Kokkos::MemoryTraits<Kokkos::Unmanaged> >;
621 ordinal_type scalarSizePerPoint = (operatorType == OPERATOR_VALUE) ?
622 3*this->vinvLine_.extent(0)+this->vinvBubble_.extent(0):
623 5*this->vinvLine_.extent(0)+this->vinvBubble_.extent(0);
624 ordinal_type sizePerPoint = scalarSizePerPoint*get_dimension_scalar(inputPoints);
625 WorkViewType workView(scratchStorage, sizePerPoint*team_member.team_size());
626 using range_type = Kokkos::pair<ordinal_type,ordinal_type>;
628 switch(operatorType) {
630 Kokkos::parallel_for (Kokkos::TeamThreadRange (team_member, numPoints), [=, &vinvLine_ = this->vinvLine_, &vinvBubble_ = this->vinvBubble_] (ordinal_type& pt) {
631 auto output = Kokkos::subview( outputValues, Kokkos::ALL(), range_type (pt,pt+1), Kokkos::ALL() );
632 const auto input = Kokkos::subview( inputPoints, range_type(pt, pt+1), Kokkos::ALL() );
633 WorkViewType work(workView.data() + sizePerPoint*team_member.team_rank(), sizePerPoint);
634 Impl::Basis_HCURL_HEX_In_FEM::Serial<OPERATOR_VALUE>::getValues( output, input, work, vinvLine_, vinvBubble_ );
638 Kokkos::parallel_for (Kokkos::TeamThreadRange (team_member, numPoints), [=, &vinvLine_ = this->vinvLine_, &vinvBubble_ = this->vinvBubble_] (ordinal_type& pt) {
639 auto output = Kokkos::subview( outputValues, Kokkos::ALL(), range_type(pt,pt+1), Kokkos::ALL() );
640 const auto input = Kokkos::subview( inputPoints, range_type(pt,pt+1), Kokkos::ALL() );
641 WorkViewType work(workView.data() + sizePerPoint*team_member.team_rank(), sizePerPoint);
642 Impl::Basis_HCURL_HEX_In_FEM::Serial<OPERATOR_CURL>::getValues( output, input, work, vinvLine_, vinvBubble_ );
646 INTREPID2_TEST_FOR_ABORT(
true,
647 ">>> ERROR (Basis_HCURL_HEX_In_FEM): getValues not implemented for this operator");
KOKKOS_INLINE_FUNCTION std::enable_if< std::is_pointer_v< CtorProp > &&!std::is_convertible_v< CtorProp, constchar * >, OutViewType >::type createMatchingUnmanagedView(const InViewType &view, const CtorProp &data, const Dims... dims)
Creates an unmanaged view that matches the value_type of the provided view The type of the output vie...
DeduceDynRankView< InViewType >::type createMatchingDynRankView(const InViewType &view, const CtorProp &prop, const Dims... dims)
Creates and returns a view that matches the value_type of the provided view The output view type is d...
Kokkos::DynRankView< typename ScalarViewType::value_type, DeviceType > vinvLine_
inverse of Generalized Vandermonde matrix (isotropic order)
Basis_HCURL_HEX_In_FEM(const ordinal_type order, const EPointType pointType=POINTTYPE_EQUISPACED)
Constructor.
EPointType pointType_
type of lattice used for creating the DoF coordinates
Implementation of the locally H(grad)-compatible FEM basis of variable order on the [-1,...
virtual void getDofCoords(ScalarViewType dofCoords) const override
Returns spatial locations (coordinates) of degrees of freedom on the reference cell.
Implementation of the locally HVOL-compatible FEM basis of variable order on the [-1,...
virtual void getDofCoords(ScalarViewType dofCoords) const override
Returns spatial locations (coordinates) of degrees of freedom on the reference cell.
ECoordinates basisCoordinates_
const OrdinalTypeArrayStride1DHost getDofTag(const ordinal_type dofOrd) const
DoF ordinal to DoF tag lookup.
ordinal_type basisDegree_
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)
ordinal_type getCardinality() const
Returns cardinality of the basis.
OrdinalTypeArray2DHost ordinalToTag_
Kokkos::DynRankView< scalarType, DeviceType > dofCoords_
Kokkos::DynRankView< scalarType, DeviceType > dofCoeffs_
ordinal_type basisCardinality_
OrdinalTypeArray3DHost tagToOrdinal_
unsigned basisCellTopologyKey_
EFunctionSpace functionSpace_
static constexpr ordinal_type MaxOrder
The maximum reconstruction order.
See Intrepid2::Basis_HCURL_HEX_In_FEM.
See Intrepid2::Basis_HCURL_HEX_In_FEM.