49 #ifndef __INTREPID2_PROJECTIONTOOLSDEFHCURL_HPP__
50 #define __INTREPID2_PROJECTIONTOOLSDEFHCURL_HPP__
60 namespace FunctorsProjectionTools {
63 template<
typename ViewType1,
typename ViewType2,
typename ViewType3>
65 ViewType1 basisTanAtBasisEPoints_;
66 ViewType1 weightedTanBasisAtBasisEPoints_;
67 const ViewType1 basisAtBasisEPoints_;
68 const ViewType2 basisEWeights_;
69 const ViewType1 refEdgeTangent_;
70 const ViewType3 tagToOrdinal_;
71 ordinal_type edgeDim_;
73 ordinal_type offsetBasis_;
76 ViewType1 basisAtBasisEPoints, ViewType2 basisEWeights, ViewType1 refEdgeTangent, ViewType3 tagToOrdinal,
77 ordinal_type edgeDim, ordinal_type iedge, ordinal_type offsetBasis) :
78 basisTanAtBasisEPoints_(basisTanAtBasisEPoints), weightedTanBasisAtBasisEPoints_(weightedTanBasisAtBasisEPoints), basisAtBasisEPoints_(basisAtBasisEPoints),
79 basisEWeights_(basisEWeights), refEdgeTangent_(refEdgeTangent), tagToOrdinal_(tagToOrdinal),
80 edgeDim_(edgeDim), iedge_(iedge), offsetBasis_(offsetBasis) {}
83 KOKKOS_INLINE_FUNCTION
84 operator()(
const ordinal_type j,
const ordinal_type iq)
const {
85 ordinal_type jdof = tagToOrdinal_(edgeDim_, iedge_, j);
86 for(ordinal_type d=0; d <ordinal_type(refEdgeTangent_.extent(0)); ++d)
87 basisTanAtBasisEPoints_(0,j,iq) += refEdgeTangent_(d)*basisAtBasisEPoints_(jdof,offsetBasis_+iq,d);
88 weightedTanBasisAtBasisEPoints_(0,j,iq) = basisTanAtBasisEPoints_(0,j,iq)*basisEWeights_(iq);
92 template<
typename ViewType1,
typename ViewType2,
typename ViewType3,
typename ViewType4>
94 const ViewType2 targetEWeights_;
95 const ViewType1 basisAtTargetEPoints_;
96 const ViewType1 wTanBasisAtTargetEPoints_;
97 const ViewType3 tagToOrdinal_;
98 const ViewType4 targetAtTargetEPoints_;
99 const ViewType1 targetTanAtTargetEPoints_;
100 const ViewType1 refEdgeTangent_;
101 ordinal_type edgeCardinality_;
102 ordinal_type offsetTarget_;
103 ordinal_type edgeDim_;
108 const ViewType2 targetEWeights,
109 const ViewType1 basisAtTargetEPoints,
const ViewType1 wTanBasisAtTargetEPoints,
const ViewType3 tagToOrdinal,
110 const ViewType4 targetAtTargetEPoints,
const ViewType1 targetTanAtTargetEPoints,
111 const ViewType1 refEdgeTangent, ordinal_type edgeCardinality,
112 ordinal_type offsetTarget, ordinal_type edgeDim,
113 ordinal_type dim, ordinal_type iedge) :
114 targetEWeights_(targetEWeights),
115 basisAtTargetEPoints_(basisAtTargetEPoints), wTanBasisAtTargetEPoints_(wTanBasisAtTargetEPoints),
116 tagToOrdinal_(tagToOrdinal), targetAtTargetEPoints_(targetAtTargetEPoints),
117 targetTanAtTargetEPoints_(targetTanAtTargetEPoints),
118 refEdgeTangent_(refEdgeTangent), edgeCardinality_(edgeCardinality),
119 offsetTarget_(offsetTarget), edgeDim_(edgeDim), dim_(dim), iedge_(iedge)
123 KOKKOS_INLINE_FUNCTION
124 operator()(
const ordinal_type ic)
const {
126 ordinal_type numTargetEPoints = targetEWeights_.extent(0);
127 typename ViewType1::value_type tmp = 0;
128 for(ordinal_type j=0; j <edgeCardinality_; ++j) {
129 ordinal_type jdof = tagToOrdinal_(edgeDim_, iedge_, j);
130 for(ordinal_type iq=0; iq <numTargetEPoints; ++iq) {
132 for(ordinal_type d=0; d <dim_; ++d)
133 tmp += refEdgeTangent_(d)*basisAtTargetEPoints_(jdof,offsetTarget_+iq,d);
134 wTanBasisAtTargetEPoints_(ic,j,iq) = tmp*targetEWeights_(iq);
137 for(ordinal_type iq=0; iq <numTargetEPoints; ++iq)
138 for(ordinal_type d=0; d <dim_; ++d)
139 targetTanAtTargetEPoints_(ic,iq) += refEdgeTangent_(d)*targetAtTargetEPoints_(ic,offsetTarget_+iq,d);
144 template<
typename ViewType1,
typename ViewType2,
typename ViewType3,
typename ViewType4,
147 const ViewType1 basisCoeffs_;
148 const ViewType1 negPartialProjTan_;
149 const ViewType1 negPartialProjCurlNormal_;
150 const ViewType1 hgradBasisGradAtBasisEPoints_;
151 const ViewType1 wHgradBasisGradAtBasisEPoints_;
152 const ViewType1 basisCurlAtBasisCurlEPoints_;
153 const ViewType1 basisCurlNormalAtBasisCurlEPoints_;
154 const ViewType1 basisAtBasisEPoints_;
155 const ViewType1 normalTargetCurlAtTargetEPoints_;
156 const ViewType1 basisTanAtBasisEPoints_;
157 const ViewType1 hgradBasisGradAtTargetEPoints_;
158 const ViewType1 wHgradBasisGradAtTargetEPoints_;
159 const ViewType1 wNormalBasisCurlAtBasisCurlEPoints_;
160 const ViewType1 basisCurlAtTargetCurlEPoints_;
161 const ViewType1 wNormalBasisCurlBasisAtTargetCurlEPoints_;
162 const ViewType2 targetAtTargetEPoints_;
163 const ViewType1 targetTanAtTargetEPoints_;
164 const ViewType2 targetCurlAtTargetCurlEPoints_;
165 const ViewType3 basisEWeights_;
166 const ViewType3 targetEWeights_;
167 const ViewType3 basisCurlEWeights_;
168 const ViewType3 targetCurlEWeights_;
169 const ViewType4 tagToOrdinal_;
170 const ViewType4 hGradTagToOrdinal_;
171 const ViewType5 computedDofs_;
172 const ViewType1 refFaceNormal_;
173 ordinal_type offsetBasis_;
174 ordinal_type offsetBasisCurl_;
175 ordinal_type offsetTarget_;
176 ordinal_type offsetTargetCurl_;
178 ordinal_type hgradCardinality_;
179 ordinal_type numFaces_;
180 ordinal_type numFaceDofs_;
181 ordinal_type numEdgeDofs_;
182 ordinal_type faceDim_;
189 const ViewType1 negPartialProjTan,
const ViewType1 negPartialProjCurlNormal,
190 const ViewType1 hgradBasisGradAtBasisEPoints,
const ViewType1 wHgradBasisGradAtBasisEPoints,
191 const ViewType1 basisCurlAtBasisCurlEPoints,
const ViewType1 basisCurlNormalAtBasisCurlEPoints,
192 const ViewType1 basisAtBasisEPoints,
193 const ViewType1 normalTargetCurlAtTargetEPoints,
194 const ViewType1 basisTanAtBasisEPoints,
195 const ViewType1 hgradBasisGradAtTargetEPoints,
const ViewType1 wHgradBasisGradAtTargetEPoints,
196 const ViewType1 wNormalBasisCurlAtBasisCurlEPoints,
const ViewType1 basisCurlAtTargetCurlEPoints,
197 const ViewType1 wNormalBasisCurlBasisAtTargetCurlEPoints,
const ViewType2 targetAtTargetEPoints,
198 const ViewType1 targetTanAtTargetEPoints,
const ViewType2 targetCurlAtTargetCurlEPoints,
199 const ViewType3 basisEWeights,
const ViewType3 targetEWeights,
200 const ViewType3 basisCurlEWeights,
const ViewType3 targetCurlEWeights,
const ViewType4 tagToOrdinal,
201 const ViewType4 hGradTagToOrdinal,
const ViewType5 computedDofs,
202 const ViewType1 refFaceNormal , ordinal_type offsetBasis,
203 ordinal_type offsetBasisCurl, ordinal_type offsetTarget,
204 ordinal_type offsetTargetCurl, ordinal_type iface,
205 ordinal_type hgradCardinality, ordinal_type numFaces,
206 ordinal_type numFaceDofs, ordinal_type numEdgeDofs,
207 ordinal_type faceDim, ordinal_type dim):
208 basisCoeffs_(basisCoeffs),
209 negPartialProjTan_(negPartialProjTan), negPartialProjCurlNormal_(negPartialProjCurlNormal),
210 hgradBasisGradAtBasisEPoints_(hgradBasisGradAtBasisEPoints), wHgradBasisGradAtBasisEPoints_(wHgradBasisGradAtBasisEPoints),
211 basisCurlAtBasisCurlEPoints_(basisCurlAtBasisCurlEPoints), basisCurlNormalAtBasisCurlEPoints_(basisCurlNormalAtBasisCurlEPoints),
212 basisAtBasisEPoints_(basisAtBasisEPoints),
213 normalTargetCurlAtTargetEPoints_(normalTargetCurlAtTargetEPoints), basisTanAtBasisEPoints_(basisTanAtBasisEPoints),
214 hgradBasisGradAtTargetEPoints_(hgradBasisGradAtTargetEPoints), wHgradBasisGradAtTargetEPoints_(wHgradBasisGradAtTargetEPoints),
215 wNormalBasisCurlAtBasisCurlEPoints_(wNormalBasisCurlAtBasisCurlEPoints), basisCurlAtTargetCurlEPoints_(basisCurlAtTargetCurlEPoints),
216 wNormalBasisCurlBasisAtTargetCurlEPoints_(wNormalBasisCurlBasisAtTargetCurlEPoints), targetAtTargetEPoints_(targetAtTargetEPoints),
217 targetTanAtTargetEPoints_(targetTanAtTargetEPoints), targetCurlAtTargetCurlEPoints_(targetCurlAtTargetCurlEPoints),
218 basisEWeights_(basisEWeights), targetEWeights_(targetEWeights),
219 basisCurlEWeights_(basisCurlEWeights), targetCurlEWeights_(targetCurlEWeights), tagToOrdinal_(tagToOrdinal),
220 hGradTagToOrdinal_(hGradTagToOrdinal), computedDofs_(computedDofs),
221 refFaceNormal_(refFaceNormal), offsetBasis_(offsetBasis),
222 offsetBasisCurl_(offsetBasisCurl), offsetTarget_(offsetTarget),
223 offsetTargetCurl_(offsetTargetCurl), iface_(iface),
224 hgradCardinality_(hgradCardinality), numFaces_(numFaces),
225 numFaceDofs_(numFaceDofs), numEdgeDofs_(numEdgeDofs),
226 faceDim_(faceDim), dim_(dim){}
229 KOKKOS_INLINE_FUNCTION
230 operator()(
const ordinal_type ic)
const {
232 typename ViewType1::value_type n[3] = {refFaceNormal_(0), refFaceNormal_(1), refFaceNormal_(2)};
233 typename ViewType1::value_type tmp=0;
235 ordinal_type numBasisEPoints = basisEWeights_.extent(0);
236 ordinal_type numTargetEPoints = targetEWeights_.extent(0);
237 for(ordinal_type j=0; j <hgradCardinality_; ++j) {
238 ordinal_type face_dof = hGradTagToOrdinal_(faceDim_, iface_, j);
239 for(ordinal_type iq=0; iq <numBasisEPoints; ++iq) {
240 for(ordinal_type d=0; d <dim_; ++d) {
241 ordinal_type dp1 = (d+1) % dim_;
242 ordinal_type dp2 = (d+2) % dim_;
244 wHgradBasisGradAtBasisEPoints_(ic,j,iq,d) = (hgradBasisGradAtBasisEPoints_(face_dof,iq,dp1)*n[dp2] - hgradBasisGradAtBasisEPoints_(face_dof,iq,dp2)*n[dp1]) * basisEWeights_(iq);
248 for(ordinal_type iq=0; iq <numTargetEPoints; ++iq) {
249 for(ordinal_type d=0; d <dim_; ++d) {
250 ordinal_type dp1 = (d+1) % dim_;
251 ordinal_type dp2 = (d+2) % dim_;
252 wHgradBasisGradAtTargetEPoints_(ic,j,iq,d) = (hgradBasisGradAtTargetEPoints_(face_dof,iq,dp1)*n[dp2] - hgradBasisGradAtTargetEPoints_(face_dof,iq,dp2)*n[dp1]) * targetEWeights_(iq);
257 ordinal_type numBasisCurlEPoints = basisCurlEWeights_.extent(0);
258 for(ordinal_type j=0; j <numFaceDofs_; ++j) {
259 ordinal_type jdof = tagToOrdinal_(faceDim_, iface_, j);
260 for(ordinal_type iq=0; iq <numBasisEPoints; ++iq) {
261 for(ordinal_type d=0; d <dim_; ++d) {
262 ordinal_type dp1 = (d+1) % dim_;
263 ordinal_type dp2 = (d+2) % dim_;
265 basisTanAtBasisEPoints_(0,j,iq,d) = basisAtBasisEPoints_(jdof,offsetBasis_+iq,dp1)*n[dp2] - basisAtBasisEPoints_(jdof,offsetBasis_+iq,dp2)*n[dp1];
269 for(ordinal_type iq=0; iq <numBasisCurlEPoints; ++iq) {
271 for(ordinal_type d=0; d <dim_; ++d)
272 tmp += n[d]*basisCurlAtBasisCurlEPoints_(jdof,offsetBasisCurl_+iq,d);
273 basisCurlNormalAtBasisCurlEPoints_(0,j,iq) = tmp;
274 wNormalBasisCurlAtBasisCurlEPoints_(ic,j,iq) = tmp * basisCurlEWeights_(iq);
277 ordinal_type numTargetCurlEPoints = targetCurlEWeights_.extent(0);
278 for(ordinal_type iq=0; iq <numTargetCurlEPoints; ++iq) {
281 for(ordinal_type d=0; d <dim_; ++d)
282 tmp += n[d]*basisCurlAtTargetCurlEPoints_(jdof,offsetTargetCurl_+iq,d);
283 wNormalBasisCurlBasisAtTargetCurlEPoints_(ic,j,iq) = tmp*targetCurlEWeights_(iq);
287 for(ordinal_type j=0; j <numEdgeDofs_; ++j) {
288 ordinal_type jdof = computedDofs_(j);
289 for(ordinal_type iq=0; iq <numBasisEPoints; ++iq)
290 for(ordinal_type d=0; d <dim_; ++d) {
291 ordinal_type dp1 = (d+1) % dim_;
292 ordinal_type dp2 = (d+2) % dim_;
293 negPartialProjCurlNormal_(ic,iq) -= n[d]*basisCoeffs_(ic,jdof)*basisCurlAtBasisCurlEPoints_(jdof,offsetBasisCurl_+iq,d);
295 negPartialProjTan_(ic,iq,d) -= (basisAtBasisEPoints_(jdof,offsetBasis_+iq,dp1)*n[dp2] - basisAtBasisEPoints_(jdof,offsetBasis_+iq,dp2)*n[dp1])*basisCoeffs_(ic,jdof);
299 ordinal_type numTargetCurlEPoints = targetCurlEWeights_.extent(0);
300 for(ordinal_type iq=0; iq <numTargetEPoints; ++iq)
301 for(ordinal_type d=0; d <dim_; ++d) {
302 ordinal_type dp1 = (d+1) % dim_;
303 ordinal_type dp2 = (d+2) % dim_;
305 targetTanAtTargetEPoints_(ic,iq,d) = (targetAtTargetEPoints_(ic,offsetTarget_+iq,dp1)*n[dp2] - targetAtTargetEPoints_(ic,offsetTarget_+iq,dp2)*n[dp1]);
308 for(ordinal_type iq=0; iq <numTargetCurlEPoints; ++iq)
309 for(ordinal_type d=0; d <dim_; ++d) {
311 normalTargetCurlAtTargetEPoints_(ic,iq) += n[d]*targetCurlAtTargetCurlEPoints_(ic,offsetTargetCurl_+iq,d);
317 template<
typename ViewType1,
typename ViewType2,
typename ViewType3,
320 const ViewType1 basisCoeffs_;
321 const ViewType1 negPartialProj_;
322 const ViewType1 negPartialProjCurl_;
323 const ViewType1 cellBasisAtBasisEPoints_;
324 const ViewType1 cellBasisCurlAtBasisCurlEPoints_;
325 const ViewType1 basisAtBasisEPoints_;
326 const ViewType1 hgradBasisGradAtBasisEPoints_;
327 const ViewType1 basisCurlAtBasisCurlEPoints_;
328 const ViewType1 hgradBasisGradAtTargetEPoints_;
329 const ViewType1 basisCurlAtTargetCurlEPoints_;
330 const ViewType2 basisEWeights_;
331 const ViewType2 basisCurlEWeights_;
332 const ViewType1 wHgradBasisGradAtBasisEPoints_;
333 const ViewType1 wBasisCurlAtBasisCurlEPoints_;
334 const ViewType2 targetEWeights_;
335 const ViewType2 targetCurlEWeights_;
336 const ViewType1 wHgradBasisGradAtTargetEPoints_;
337 const ViewType1 wBasisCurlAtTargetCurlEPoints_;
338 const ViewType3 computedDofs_;
339 const ViewType4 tagToOrdinal_;
340 const ViewType4 hGradTagToOrdinal_;
341 ordinal_type numCellDofs_;
342 ordinal_type hgradCardinality_;
343 ordinal_type offsetBasis_;
344 ordinal_type offsetBasisCurl_;
345 ordinal_type offsetTargetCurl_;
346 ordinal_type numEdgeFaceDofs_;
348 ordinal_type derDim_;
351 const ViewType1 cellBasisAtBasisEPoints,
const ViewType1 cellBasisCurlAtBasisCurlEPoints,
352 const ViewType1 basisAtBasisEPoints,
const ViewType1 hgradBasisGradAtBasisEPoints,
const ViewType1 basisCurlAtBasisCurlEPoints,
353 const ViewType1 hgradBasisGradAtTargetEPoints,
const ViewType1 basisCurlAtTargetCurlEPoints,
354 const ViewType2 basisEWeights,
const ViewType2 basisCurlEWeights,
355 const ViewType1 wHgradBasisGradAtBasisEPoints,
const ViewType1 wBasisCurlAtBasisCurlEPoints,
356 const ViewType2 targetEWeights,
const ViewType2 targetCurlEWeights,
357 const ViewType1 wHgradBasisGradAtTargetEPoints,
358 const ViewType1 wBasisCurlAtTargetCurlEPoints,
const ViewType3 computedDofs,
359 const ViewType4 tagToOrdinal,
const ViewType4 hGradTagToOrdinal,
360 ordinal_type numCellDofs, ordinal_type hgradCardinality,
361 ordinal_type offsetBasis, ordinal_type offsetBasisCurl, ordinal_type offsetTargetCurl,
362 ordinal_type numEdgeFaceDofs, ordinal_type dim, ordinal_type derDim) :
363 basisCoeffs_(basisCoeffs), negPartialProj_(negPartialProj), negPartialProjCurl_(negPartialProjCurl),
364 cellBasisAtBasisEPoints_(cellBasisAtBasisEPoints), cellBasisCurlAtBasisCurlEPoints_(cellBasisCurlAtBasisCurlEPoints),
365 basisAtBasisEPoints_(basisAtBasisEPoints), hgradBasisGradAtBasisEPoints_(hgradBasisGradAtBasisEPoints),
366 basisCurlAtBasisCurlEPoints_(basisCurlAtBasisCurlEPoints),
367 hgradBasisGradAtTargetEPoints_(hgradBasisGradAtTargetEPoints),
368 basisCurlAtTargetCurlEPoints_(basisCurlAtTargetCurlEPoints),
369 basisEWeights_(basisEWeights), basisCurlEWeights_(basisCurlEWeights),
370 wHgradBasisGradAtBasisEPoints_(wHgradBasisGradAtBasisEPoints),
371 wBasisCurlAtBasisCurlEPoints_(wBasisCurlAtBasisCurlEPoints),
372 targetEWeights_(targetEWeights), targetCurlEWeights_(targetCurlEWeights),
373 wHgradBasisGradAtTargetEPoints_(wHgradBasisGradAtTargetEPoints),
374 wBasisCurlAtTargetCurlEPoints_(wBasisCurlAtTargetCurlEPoints),
375 computedDofs_(computedDofs), tagToOrdinal_(tagToOrdinal), hGradTagToOrdinal_(hGradTagToOrdinal),
376 numCellDofs_(numCellDofs), hgradCardinality_(hgradCardinality),
377 offsetBasis_(offsetBasis), offsetBasisCurl_(offsetBasisCurl), offsetTargetCurl_(offsetTargetCurl),
378 numEdgeFaceDofs_(numEdgeFaceDofs), dim_(dim), derDim_(derDim) {}
381 KOKKOS_INLINE_FUNCTION
382 operator()(
const ordinal_type ic)
const {
384 ordinal_type numBasisPoints = basisEWeights_.extent(0);
385 ordinal_type numBasisCurlPoints = basisCurlEWeights_.extent(0);
386 ordinal_type numTargetPoints = targetEWeights_.extent(0);
387 ordinal_type numTargetCurlPoints = targetCurlEWeights_.extent(0);
388 for(ordinal_type j=0; j <hgradCardinality_; ++j) {
389 ordinal_type idof = hGradTagToOrdinal_(dim_, 0, j);
390 for(ordinal_type d=0; d <dim_; ++d) {
391 for(ordinal_type iq=0; iq <numBasisPoints; ++iq)
392 wHgradBasisGradAtBasisEPoints_(ic,j,iq,d) = hgradBasisGradAtBasisEPoints_(idof,iq,d)*basisEWeights_(iq);
393 for(ordinal_type iq=0; iq <numTargetPoints; ++iq)
394 wHgradBasisGradAtTargetEPoints_(ic,j,iq,d) = hgradBasisGradAtTargetEPoints_(idof,iq,d)*targetEWeights_(iq);
397 for(ordinal_type j=0; j <numCellDofs_; ++j) {
398 ordinal_type idof = tagToOrdinal_(dim_, 0, j);
399 for(ordinal_type d=0; d <dim_; ++d)
400 for(ordinal_type iq=0; iq <numBasisPoints; ++iq)
401 cellBasisAtBasisEPoints_(0,j,iq,d)=basisAtBasisEPoints_(idof,offsetBasis_+iq,d);
403 for(ordinal_type d=0; d <derDim_; ++d) {
404 for(ordinal_type iq=0; iq <numBasisCurlPoints; ++iq) {
405 cellBasisCurlAtBasisCurlEPoints_(0,j,iq,d)=basisCurlAtBasisCurlEPoints_(idof,offsetBasisCurl_+iq,d);
406 wBasisCurlAtBasisCurlEPoints_(ic,j,iq,d)=cellBasisCurlAtBasisCurlEPoints_(0,j,iq,d)*basisCurlEWeights_(iq);
408 for(ordinal_type iq=0; iq <numTargetCurlPoints; ++iq)
409 wBasisCurlAtTargetCurlEPoints_(ic,j,iq,d) = basisCurlAtTargetCurlEPoints_(idof,offsetTargetCurl_+iq,d)*targetCurlEWeights_(iq);
412 for(ordinal_type j=0; j < numEdgeFaceDofs_; ++j) {
413 ordinal_type jdof = computedDofs_(j);
414 for(ordinal_type d=0; d <derDim_; ++d)
415 for(ordinal_type iq=0; iq <numBasisCurlPoints; ++iq)
416 negPartialProjCurl_(ic,iq,d) -= basisCoeffs_(ic,jdof)*basisCurlAtBasisCurlEPoints_(jdof,offsetBasisCurl_+iq,d);
417 for(ordinal_type d=0; d <dim_; ++d)
418 for(ordinal_type iq=0; iq <numBasisPoints; ++iq)
419 negPartialProj_(ic,iq,d) -= basisCoeffs_(ic,jdof)*basisAtBasisEPoints_(jdof,offsetBasis_+iq,d);
427 template<
typename DeviceType>
428 template<
typename basisCoeffsValueType,
class ...basisCoeffsProperties,
429 typename funValsValueType,
class ...funValsProperties,
431 typename ortValueType,
class ...ortProperties>
434 const Kokkos::DynRankView<funValsValueType,funValsProperties...> targetAtTargetEPoints,
435 const Kokkos::DynRankView<funValsValueType,funValsProperties...> targetCurlAtTargetCurlEPoints,
436 const Kokkos::DynRankView<ortValueType, ortProperties...> orts,
437 const BasisType* cellBasis,
440 typedef typename BasisType::scalarType scalarType;
441 typedef Kokkos::DynRankView<scalarType,DeviceType> ScalarViewType;
442 typedef Kokkos::pair<ordinal_type,ordinal_type> range_type;
443 const auto cellTopo = cellBasis->getBaseCellTopology();
444 ordinal_type dim = cellTopo.getDimension();
445 ordinal_type basisCardinality = cellBasis->getCardinality();
446 ordinal_type numCells = targetAtTargetEPoints.extent(0);
447 const ordinal_type edgeDim = 1;
448 const ordinal_type faceDim = 2;
449 const ordinal_type derDim = dim == 3 ? dim : 1;
451 const Kokkos::RangePolicy<ExecSpaceType> policy(0, numCells);
453 const std::string& name = cellBasis->getName();
455 ordinal_type numEdges = (cellBasis->getDofCount(1, 0) > 0) ? cellTopo.getEdgeCount() : 0;
456 ordinal_type numFaces = (cellBasis->getDofCount(2, 0) > 0) ? cellTopo.getFaceCount() : 0;
458 ScalarViewType refEdgeTangent(
"refEdgeTangent", dim);
459 ScalarViewType refFaceNormal(
"refFaceNormal", dim);
461 ordinal_type numEdgeDofs(0);
462 for(ordinal_type ie=0; ie<numEdges; ++ie)
463 numEdgeDofs += cellBasis->getDofCount(edgeDim,ie);
465 ordinal_type numTotalFaceDofs(0);
466 for(ordinal_type iface=0; iface<numFaces; ++iface)
467 numTotalFaceDofs += cellBasis->getDofCount(faceDim,iface);
469 auto tagToOrdinal = Kokkos::create_mirror_view_and_copy(MemSpaceType(), cellBasis->getAllDofOrdinal());
471 Kokkos::View<ordinal_type*, DeviceType> computedDofs(
"computedDofs",numEdgeDofs+numTotalFaceDofs);
487 ScalarViewType basisAtBasisEPoints(
"basisAtBasisEPoints",basisCardinality, numTotalBasisEPoints, dim);
488 ScalarViewType basisAtTargetEPoints(
"basisAtTargetEPoints",basisCardinality, numTotalTargetEPoints, dim);
489 cellBasis->getValues(basisAtTargetEPoints, targetEPoints);
490 cellBasis->getValues(basisAtBasisEPoints, basisEPoints);
492 ScalarViewType basisCurlAtBasisCurlEPoints;
493 ScalarViewType basisCurlAtTargetCurlEPoints;
494 if(numTotalBasisCurlEPoints>0) {
495 ScalarViewType nonOrientedBasisCurlAtTargetCurlEPoints, nonOrientedBasisCurlAtBasisCurlEPoints;
497 basisCurlAtBasisCurlEPoints = ScalarViewType (
"basisCurlAtBasisCurlEPoints",basisCardinality, numTotalBasisCurlEPoints, dim);
498 basisCurlAtTargetCurlEPoints = ScalarViewType(
"basisCurlAtTargetCurlEPoints",basisCardinality, numTotalTargetCurlEPoints, dim);
500 basisCurlAtBasisCurlEPoints = ScalarViewType (
"basisCurlAtBasisCurlEPoints",basisCardinality, numTotalBasisCurlEPoints);
501 basisCurlAtTargetCurlEPoints = ScalarViewType(
"basisCurlAtTargetCurlEPoints",basisCardinality, numTotalTargetCurlEPoints);
504 cellBasis->getValues(basisCurlAtBasisCurlEPoints, basisCurlEPoints,OPERATOR_CURL);
505 cellBasis->getValues(basisCurlAtTargetCurlEPoints, targetCurlEPoints,OPERATOR_CURL);
508 ScalarViewType refBasisCoeffs(
"refBasisCoeffs", basisCoeffs.extent(0), basisCoeffs.extent(1));
510 ordinal_type computedDofsCount = 0;
511 for(ordinal_type ie=0; ie<numEdges; ++ie) {
513 ordinal_type edgeCardinality = cellBasis->getDofCount(edgeDim,ie);
514 ordinal_type numBasisEPoints = range_size(basisEPointsRange(edgeDim, ie));
515 ordinal_type numTargetEPoints = range_size(targetEPointsRange(edgeDim, ie));
519 ScalarViewType basisTanAtBasisEPoints(
"basisTanAtBasisEPoints",1,edgeCardinality, numBasisEPoints);
520 ScalarViewType weightedTanBasisAtBasisEPoints(
"weightedTanBasisAtBasisEPoints",1,edgeCardinality, numBasisEPoints);
521 ScalarViewType weightedTanBasisAtTargetEPoints(
"weightedTanBasisAtTargetEPoints",numCells,edgeCardinality, numTargetEPoints);
522 ScalarViewType targetTanAtTargetEPoints(
"normalTargetAtTargetEPoints",numCells, numTargetEPoints);
524 auto targetEWeights = Kokkos::create_mirror_view_and_copy(MemSpaceType(),projStruct->
getTargetEvalWeights(edgeDim,ie));
525 auto basisEWeights = Kokkos::create_mirror_view_and_copy(MemSpaceType(),projStruct->
getBasisEvalWeights(edgeDim,ie));
527 ordinal_type offsetBasis = basisEPointsRange(edgeDim, ie).first;
528 ordinal_type offsetTarget = targetEPointsRange(edgeDim, ie).first;
531 Kokkos::parallel_for(Kokkos::MDRangePolicy<ExecSpaceType, Kokkos::Rank<2> >({0,0}, {edgeCardinality,numBasisEPoints}),
532 functorTypeWBasisEdge(basisTanAtBasisEPoints,weightedTanBasisAtBasisEPoints,basisAtBasisEPoints,basisEWeights,refEdgeTangent,tagToOrdinal,edgeDim,ie,offsetBasis));
535 Kokkos::parallel_for(policy, functorTypeEdge(targetEWeights,
536 basisAtTargetEPoints, weightedTanBasisAtTargetEPoints, tagToOrdinal,
537 targetAtTargetEPoints, targetTanAtTargetEPoints,
538 refEdgeTangent, edgeCardinality,
539 offsetTarget, edgeDim,
542 ScalarViewType edgeMassMat_(
"edgeMassMat_", 1, edgeCardinality+1, edgeCardinality+1),
543 edgeRhsMat_(
"rhsMat_", numCells, edgeCardinality+1);
545 ScalarViewType eWeights_(
"eWeights_", 1, 1, basisEWeights.extent(0)), targetEWeights_(
"targetEWeights", numCells, 1, targetEWeights.extent(0));
549 range_type range_H(0, edgeCardinality);
550 range_type range_B(edgeCardinality, edgeCardinality+1);
556 typedef Kokkos::DynRankView<scalarType, Kokkos::LayoutRight, DeviceType> WorkArrayViewType;
557 ScalarViewType t_(
"t",numCells, edgeCardinality+1);
558 WorkArrayViewType w_(
"w",numCells, edgeCardinality+1);
560 auto edgeDofs = Kokkos::subview(tagToOrdinal, edgeDim, ie, range_type(0,edgeCardinality));
562 edgeSystem.
solve(refBasisCoeffs, edgeMassMat_, edgeRhsMat_, t_, w_, edgeDofs, edgeCardinality, 1);
564 auto computedEdgeDofs = Kokkos::subview(computedDofs, range_type(computedDofsCount,computedDofsCount+edgeCardinality));
565 deep_copy(computedEdgeDofs, edgeDofs);
566 computedDofsCount += edgeCardinality;
570 typename RefSubcellParametrization<DeviceType>::ConstViewType subcellParamFace;
574 if(cellTopo.getKey() == shards::getCellTopologyData<shards::Hexahedron<8> >()->key)
576 else if(cellTopo.getKey() == shards::getCellTopologyData<shards::Tetrahedron<4> >()->key)
578 else if(cellTopo.getKey() == shards::getCellTopologyData<shards::Wedge<6> >()->key) {
582 std::stringstream ss;
583 ss <<
">>> ERROR (Intrepid2::ProjectionTools::getHCurlBasisCoeffs): "
584 <<
"Method not implemented for basis " << name;
585 INTREPID2_TEST_FOR_EXCEPTION(
true, std::runtime_error, ss.str().c_str() );
588 for(ordinal_type iface=0; iface<numFaces; ++iface) {
590 ordinal_type numTargetEPoints = range_size(targetEPointsRange(faceDim, iface));
591 ordinal_type numTargetCurlEPoints = range_size(targetCurlEPointsRange(faceDim, iface));
592 ordinal_type numBasisEPoints = range_size(basisEPointsRange(faceDim, iface));
593 ordinal_type numBasisCurlEPoints = range_size(basisCurlEPointsRange(faceDim, iface));
595 ordinal_type numFaceDofs = cellBasis->getDofCount(faceDim,iface);
597 ScalarViewType hgradBasisGradAtBasisEPoints(
"hgradBasisGradAtBasisEPoints", hgradBasis->
getCardinality(), numBasisEPoints, dim);
598 ScalarViewType hgradBasisGradAtTargetEPoints(
"hgradBasisGradAtTargetEPoints", hgradBasis->
getCardinality(), numTargetEPoints, dim);
600 ordinal_type hgradCardinality = hgradBasis->
getDofCount(faceDim,iface);
602 hgradBasis->
getValues(hgradBasisGradAtBasisEPoints, Kokkos::subview(basisEPoints, basisEPointsRange(faceDim, iface), Kokkos::ALL()), OPERATOR_GRAD);
603 hgradBasis->
getValues(hgradBasisGradAtTargetEPoints, Kokkos::subview(targetEPoints, targetEPointsRange(faceDim, iface), Kokkos::ALL()), OPERATOR_GRAD);
607 auto hGradTagToOrdinal = Kokkos::create_mirror_view_and_copy(MemSpaceType(), hgradBasis->
getAllDofOrdinal());
609 ScalarViewType basisTanAtBasisEPoints(
"basisTanAtBasisEPoints",1,numFaceDofs, numBasisEPoints,dim);
610 ScalarViewType basisCurlNormalAtBasisCurlEPoints(
"normaBasisCurlAtBasisEPoints",1,numFaceDofs, numBasisCurlEPoints);
611 ScalarViewType wNormalBasisCurlAtBasisCurlEPoints(
"weightedNormalBasisCurlAtBasisEPoints",numCells,numFaceDofs, numBasisCurlEPoints);
613 ScalarViewType targetTanAtTargetEPoints(
"targetTanAtTargetEPoints",numCells, numTargetEPoints, dim);
614 ScalarViewType normalTargetCurlAtTargetEPoints(
"normalTargetCurlAtTargetEPoints",numCells, numTargetCurlEPoints);
615 ScalarViewType wNormalBasisCurlBasisAtTargetCurlEPoints(
"weightedNormalBasisCurlAtTargetCurlEPoints",numCells,numFaceDofs, numTargetCurlEPoints);
617 ScalarViewType wHgradBasisGradAtBasisEPoints(
"wHgradBasisGradAtBasisEPoints",numCells, hgradCardinality, numBasisEPoints, dim);
618 ScalarViewType wHgradBasisGradAtTargetEPoints(
"wHgradBasisGradAtTargetEPoints",numCells, hgradCardinality, numTargetEPoints, dim);
620 ScalarViewType negPartialProjCurlNormal(
"mNormalComputedProjection", numCells,numBasisEPoints);
621 ScalarViewType negPartialProjTan(
"negPartialProjTan", numCells,numBasisEPoints,dim);
623 ordinal_type offsetBasis = basisEPointsRange(faceDim, iface).first;
624 ordinal_type offsetBasisCurl = basisCurlEPointsRange(faceDim, iface).first;
625 ordinal_type offsetTarget = targetEPointsRange(faceDim, iface).first;
626 ordinal_type offsetTargetCurl = targetCurlEPointsRange(faceDim, iface).first;
628 auto basisEWeights = Kokkos::create_mirror_view_and_copy(MemSpaceType(),projStruct->
getBasisEvalWeights(faceDim,iface));
629 auto targetEWeights = Kokkos::create_mirror_view_and_copy(MemSpaceType(),projStruct->
getTargetEvalWeights(faceDim,iface));
630 auto targetCurlEWeights = Kokkos::create_mirror_view_and_copy(MemSpaceType(),projStruct->
getTargetDerivEvalWeights(faceDim,iface));
631 auto basisCurlEWeights = Kokkos::create_mirror_view_and_copy(MemSpaceType(),projStruct->
getBasisDerivEvalWeights(faceDim,iface));
636 decltype(tagToOrdinal), decltype(computedDofs)>;
637 Kokkos::parallel_for(policy, functorTypeFaces(refBasisCoeffs,
638 negPartialProjTan, negPartialProjCurlNormal,
639 hgradBasisGradAtBasisEPoints, wHgradBasisGradAtBasisEPoints,
640 basisCurlAtBasisCurlEPoints, basisCurlNormalAtBasisCurlEPoints,
642 normalTargetCurlAtTargetEPoints, basisTanAtBasisEPoints,
643 hgradBasisGradAtTargetEPoints, wHgradBasisGradAtTargetEPoints,
644 wNormalBasisCurlAtBasisCurlEPoints, basisCurlAtTargetCurlEPoints,
645 wNormalBasisCurlBasisAtTargetCurlEPoints, targetAtTargetEPoints,
646 targetTanAtTargetEPoints, targetCurlAtTargetCurlEPoints,
647 basisEWeights, targetEWeights,
648 basisCurlEWeights, targetCurlEWeights, tagToOrdinal,
650 computedDofs, refFaceNormal, offsetBasis,
651 offsetBasisCurl, offsetTarget,
652 offsetTargetCurl, iface,
653 hgradCardinality, numFaces,
654 numFaceDofs, numEdgeDofs,
658 ScalarViewType faceMassMat_(
"faceMassMat_", 1, numFaceDofs+hgradCardinality, numFaceDofs+hgradCardinality),
659 faceRhsMat_(
"rhsMat_", numCells, numFaceDofs+hgradCardinality);
660 range_type range_H(0, numFaceDofs);
661 range_type range_B(numFaceDofs, numFaceDofs+hgradCardinality);
662 FunctionSpaceTools<DeviceType >::integrate(Kokkos::subview(faceMassMat_,Kokkos::ALL(),range_H,range_H), basisCurlNormalAtBasisCurlEPoints, Kokkos::subview(wNormalBasisCurlAtBasisCurlEPoints, std::make_pair(0,1), Kokkos::ALL(), Kokkos::ALL()) );
663 FunctionSpaceTools<DeviceType >::integrate(Kokkos::subview(faceMassMat_,Kokkos::ALL(),range_H,range_B), basisTanAtBasisEPoints, Kokkos::subview(wHgradBasisGradAtBasisEPoints, std::make_pair(0,1), Kokkos::ALL(), Kokkos::ALL(), Kokkos::ALL()) );
672 typedef Kokkos::DynRankView<scalarType, Kokkos::LayoutRight, DeviceType> WorkArrayViewType;
673 ScalarViewType t_(
"t",numCells, numFaceDofs+hgradCardinality);
674 WorkArrayViewType w_(
"w",numCells, numFaceDofs+hgradCardinality);
676 auto faceDofs = Kokkos::subview(tagToOrdinal, faceDim, iface, range_type(0,numFaceDofs));
678 faceSystem.
solve(refBasisCoeffs, faceMassMat_, faceRhsMat_, t_, w_, faceDofs, numFaceDofs, hgradCardinality);
680 auto computedFaceDofs = Kokkos::subview(computedDofs, range_type(computedDofsCount,computedDofsCount+numFaceDofs));
681 deep_copy(computedFaceDofs, faceDofs);
682 computedDofsCount += numFaceDofs;
687 ordinal_type numCellDofs = cellBasis->
getDofCount(dim,0);
689 if(cellTopo.getKey() == shards::getCellTopologyData<shards::Hexahedron<8> >()->key)
691 else if(cellTopo.getKey() == shards::getCellTopologyData<shards::Tetrahedron<4> >()->key)
693 else if(cellTopo.getKey() == shards::getCellTopologyData<shards::Wedge<6> >()->key)
695 else if(cellTopo.getKey() == shards::getCellTopologyData<shards::Triangle<3> >()->key)
697 else if(cellTopo.getKey() == shards::getCellTopologyData<shards::Quadrilateral<4> >()->key)
700 std::stringstream ss;
701 ss <<
">>> ERROR (Intrepid2::ProjectionTools::getHCurlBasisCoeffs): "
702 <<
"Method not implemented for basis " << name;
703 INTREPID2_TEST_FOR_EXCEPTION(
true, std::runtime_error, ss.str().c_str() );
706 range_type cellPointsRange = targetEPointsRange(dim, 0);
707 range_type cellCurlPointsRange = targetCurlEPointsRange(dim, 0);
709 ordinal_type numTargetCurlEPoints = range_size(targetCurlEPointsRange(dim,0));
710 ordinal_type numBasisCurlEPoints = range_size(basisCurlEPointsRange(dim,0));
711 ordinal_type numBasisEPoints = range_size(basisEPointsRange(dim,0));
712 ordinal_type numTargetEPoints = range_size(targetEPointsRange(dim,0));
714 ScalarViewType hgradBasisGradAtBasisEPoints(
"hgradBasisGradAtBasisEPoints",hgradBasis->
getCardinality(), numBasisEPoints, dim);
715 ScalarViewType hgradBasisGradAtTargetEPoints(
"hgradBasisGradAtTargetEPoints",hgradBasis->
getCardinality(), numTargetEPoints, dim);
717 ordinal_type hgradCardinality = hgradBasis->
getDofCount(dim,0);
718 ScalarViewType wHgradBasisGradAtTargetEPoints(
"wHgradBasisGradAtTargetEPoints",numCells, hgradCardinality, numTargetEPoints, dim);
719 ScalarViewType wHgradBasisGradAtBasisEPoints(
"wHgradBasisGradAtBasisEPoints",numCells, hgradCardinality, numBasisEPoints, dim);
721 hgradBasis->
getValues(hgradBasisGradAtBasisEPoints,Kokkos::subview(basisEPoints, basisEPointsRange(dim, 0), Kokkos::ALL()), OPERATOR_GRAD);
722 hgradBasis->
getValues(hgradBasisGradAtTargetEPoints,Kokkos::subview(targetEPoints, targetEPointsRange(dim, 0), Kokkos::ALL()),OPERATOR_GRAD);
724 ScalarViewType cellBasisAtBasisEPoints(
"basisCellAtEPoints",1,numCellDofs, numBasisEPoints, dim);
725 ScalarViewType cellBasisCurlAtCurlEPoints(
"cellBasisCurlAtCurlEPoints",1,numCellDofs, numBasisCurlEPoints, derDim);
726 ScalarViewType negPartialProjCurl(
"negPartialProjCurl", numCells, numBasisEPoints, derDim);
727 ScalarViewType negPartialProj(
"negPartialProj", numCells, numBasisEPoints, dim);
728 ScalarViewType wBasisCurlAtCurlEPoints(
"weightedBasisCurlAtBasisEPoints",numCells,numCellDofs, numBasisCurlEPoints,derDim);
729 ScalarViewType wBasisCurlBasisAtTargetCurlEPoints(
"weightedBasisCurlAtTargetCurlEPoints",numCells,numCellDofs, numTargetCurlEPoints,derDim);
731 auto targetEWeights = Kokkos::create_mirror_view_and_copy(MemSpaceType(),projStruct->
getTargetEvalWeights(dim,0));
732 auto basisEWeights = Kokkos::create_mirror_view_and_copy(MemSpaceType(),projStruct->
getBasisEvalWeights(dim,0));
733 auto targetCurlEWeights = Kokkos::create_mirror_view_and_copy(MemSpaceType(),projStruct->
getTargetDerivEvalWeights(dim,0));
734 auto basisCurlEWeights = Kokkos::create_mirror_view_and_copy(MemSpaceType(),projStruct->
getBasisDerivEvalWeights(dim,0));
735 ordinal_type offsetBasis = basisEPointsRange(dim, 0).first;
736 ordinal_type offsetBasisCurl = basisCurlEPointsRange(dim, 0).first;
737 ordinal_type offsetTargetCurl = targetCurlEPointsRange(dim, 0).first;
740 auto hGradTagToOrdinal = Kokkos::create_mirror_view_and_copy(MemSpaceType(), hgradBasis->
getAllDofOrdinal());
743 decltype(computedDofs), decltype(tagToOrdinal)>;
744 Kokkos::parallel_for(policy, functorTypeCell(refBasisCoeffs, negPartialProj, negPartialProjCurl,
745 cellBasisAtBasisEPoints, cellBasisCurlAtCurlEPoints,
746 basisAtBasisEPoints, hgradBasisGradAtBasisEPoints, basisCurlAtBasisCurlEPoints,
747 hgradBasisGradAtTargetEPoints, basisCurlAtTargetCurlEPoints,
748 basisEWeights, basisCurlEWeights, wHgradBasisGradAtBasisEPoints,
749 wBasisCurlAtCurlEPoints, targetEWeights, targetCurlEWeights,
750 wHgradBasisGradAtTargetEPoints,
751 wBasisCurlBasisAtTargetCurlEPoints, computedDofs,
752 tagToOrdinal, hGradTagToOrdinal,
753 numCellDofs, hgradCardinality,
754 offsetBasis, offsetBasisCurl, offsetTargetCurl,
755 numEdgeDofs+numTotalFaceDofs, dim, derDim));
757 ScalarViewType cellMassMat_(
"cellMassMat_", 1, numCellDofs+hgradCardinality, numCellDofs+hgradCardinality),
758 cellRhsMat_(
"rhsMat_", numCells, numCellDofs+hgradCardinality);
760 range_type range_H(0, numCellDofs);
761 range_type range_B(numCellDofs, numCellDofs+hgradCardinality);
762 FunctionSpaceTools<DeviceType >::integrate(Kokkos::subview(cellMassMat_,Kokkos::ALL(),range_H,range_H), cellBasisCurlAtCurlEPoints, Kokkos::subview(wBasisCurlAtCurlEPoints, std::make_pair(0,1), Kokkos::ALL(), Kokkos::ALL(), Kokkos::ALL()) );
763 FunctionSpaceTools<DeviceType >::integrate(Kokkos::subview(cellMassMat_,Kokkos::ALL(),range_H,range_B), cellBasisAtBasisEPoints, Kokkos::subview(wHgradBasisGradAtBasisEPoints, std::make_pair(0,1), Kokkos::ALL(), Kokkos::ALL(), Kokkos::ALL()) );
765 FunctionSpaceTools<DeviceType >::integrate(Kokkos::subview(cellRhsMat_,Kokkos::ALL(),range_H), Kokkos::subview(targetCurlAtTargetCurlEPoints,Kokkos::ALL(),cellCurlPointsRange,Kokkos::ALL()), wBasisCurlBasisAtTargetCurlEPoints);
767 FunctionSpaceTools<DeviceType >::integrate(Kokkos::subview(cellRhsMat_,Kokkos::ALL(),range_H), Kokkos::subview(targetCurlAtTargetCurlEPoints,Kokkos::ALL(),cellCurlPointsRange), Kokkos::subview(wBasisCurlBasisAtTargetCurlEPoints,Kokkos::ALL(),Kokkos::ALL(),Kokkos::ALL(),0));
770 FunctionSpaceTools<DeviceType >::integrate(Kokkos::subview(cellRhsMat_,Kokkos::ALL(),range_B), Kokkos::subview(targetAtTargetEPoints,Kokkos::ALL(),cellPointsRange,Kokkos::ALL()), wHgradBasisGradAtTargetEPoints);
773 typedef Kokkos::DynRankView<scalarType, Kokkos::LayoutRight, DeviceType> WorkArrayViewType;
774 ScalarViewType t_(
"t",numCells, numCellDofs+hgradCardinality);
775 WorkArrayViewType w_(
"w",numCells, numCellDofs+hgradCardinality);
777 auto cellDofs = Kokkos::subview(tagToOrdinal, dim, 0, Kokkos::ALL());
779 cellSystem.
solve(refBasisCoeffs, cellMassMat_, cellRhsMat_, t_, w_, cellDofs, numCellDofs, hgradCardinality);
Header file for the abstract base class Intrepid2::DefaultCubatureFactory.
ordinal_type getCardinality() const
Returns cardinality of the basis.
virtual void getValues(const ExecutionSpace &, OutputViewType, const PointViewType, const EOperator=OPERATOR_VALUE) const
Evaluation of a FEM basis on a reference cell.
ordinal_type getNumBasisDerivEvalPoints()
Returns number of evaluation points for basis derivatives.
const range_tag getBasisPointsRange() const
Returns the range tag of the basis evaluation points subcells.
const range_tag getTargetDerivPointsRange() const
Returns the range tag of the target function derivative evaluation points on subcells.
static ConstViewType get(const ordinal_type subcellDim, const unsigned parentCellKey)
Returns a Kokkos view with the coefficients of the parametrization maps for the edges or faces of a r...
host_view_type getTargetDerivEvalWeights(const ordinal_type subCellDim, const ordinal_type subCellId)
Returns the function derivatives evaluation weights on a subcell.
An abstract base class that defines interface for concrete basis implementations for Finite Element (...
ordinal_type getNumBasisEvalPoints()
Returns number of basis evaluation points.
Implementation of the default H(grad)-compatible FEM basis of degree 2 on Hexahedron cell...
const OrdinalTypeArray3DHost getAllDofOrdinal() const
DoF tag to ordinal data structure.
view_type getAllDerivEvalPoints(EvalPointsType type=TARGET) const
Returns all the evaluation points for basis/target derivatives in the cell.
view_type getAllEvalPoints(EvalPointsType type=TARGET) const
Returns the basis/target evaluation points in the cell.
Implementation of the default H(grad)-compatible Lagrange basis of arbitrary degree on Tetrahedron ce...
host_view_type getBasisEvalWeights(const ordinal_type subCellDim, const ordinal_type subCellId)
Returns the basis evaluation weights on a subcell.
ordinal_type getNumTargetEvalPoints()
Returns number of points where to evaluate the target function.
const range_tag getBasisDerivPointsRange() const
Returns the range tag of the derivative evaluation points on subcell.
const range_tag getTargetPointsRange() const
Returns the range of the target function evaluation points on subcells.
host_view_type getBasisDerivEvalWeights(const ordinal_type subCellDim, const ordinal_type subCellId)
Returns the basis derivatives evaluation weights on a subcell.
Implementation of the default H(grad)-compatible Lagrange basis of arbitrary degree on Triangle cell...
ordinal_type getNumTargetDerivEvalPoints()
Returns number of points where to evaluate the derivatives of the target function.
host_view_type getTargetEvalWeights(const ordinal_type subCellDim, const ordinal_type subCellId)
Returns the function evaluation weights on a subcell.
ordinal_type getDofCount(const ordinal_type subcDim, const ordinal_type subcOrd) const
DoF count for specified subcell.
Implementation of the default H(grad)-compatible FEM basis of degree n on Quadrilateral cell Implemen...
An helper class to compute the evaluation points and weights needed for performing projections...
Stateless class that acts as a factory for a family of nodal bases (hypercube topologies only at this...