1 #ifndef INTREPID_HGRAD_WEDGE_I2_FEMDEF_HPP 2 #define INTREPID_HGRAD_WEDGE_I2_FEMDEF_HPP 53 template<
class Scalar,
class ArrayScalar>
56 this -> basisCardinality_ = 15;
57 this -> basisDegree_ = 2;
58 this -> basisCellTopology_ = shards::CellTopology(shards::getCellTopologyData<shards::Wedge<6> >() );
59 this -> basisType_ = BASIS_FEM_DEFAULT;
60 this -> basisCoordinates_ = COORDINATES_CARTESIAN;
61 this -> basisTagsAreSet_ =
false;
65 template<
class Scalar,
class ArrayScalar>
75 int tags[] = { 0, 0, 0, 1,
94 this -> ordinalToTag_,
96 this -> basisCardinality_,
105 template<
class Scalar,
class ArrayScalar>
107 const ArrayScalar & inputPoints,
111 #ifdef HAVE_INTREPID_DEBUG 112 Intrepid::getValues_HGRAD_Args<Scalar, ArrayScalar>(outputValues,
115 this -> getBaseCellTopology(),
116 this -> getCardinality() );
120 int dim0 = inputPoints.dimension(0);
128 switch (operatorType) {
131 for (
int i0 = 0; i0 < dim0; i0++) {
132 x = inputPoints(i0, 0);
133 y = inputPoints(i0, 1);
134 z = inputPoints(i0, 2);
138 outputValues(0, i0) = 0.5 * w *(2.0*w - 2.0 - z)*(1.0 - z);
139 outputValues(1, i0) = 0.5 * x *(2.0*x - 2.0 - z)*(1.0 - z);
140 outputValues(2, i0) = 0.5 * y *(2.0*y - 2.0 - z)*(1.0 - z);
141 outputValues(3, i0) = 0.5 * w *(2.0*w - 2.0 + z)*(1.0 + z);
142 outputValues(4, i0) = 0.5 * x *(2.0*x - 2.0 + z)*(1.0 + z);
143 outputValues(5, i0) = 0.5 * y *(2.0*y - 2.0 + z)*(1.0 + z);
145 outputValues(6, i0) = 2.0 * w * x * (1.0 - z);
146 outputValues(7, i0) = 2.0 * x * y * (1.0 - z);
147 outputValues(8, i0) = 2.0 * y * w * (1.0 - z);
148 outputValues(9, i0) = w * (1.0 - z*z);
149 outputValues(10,i0) = x * (1.0 - z*z);
150 outputValues(11,i0) = y * (1.0 - z*z);
151 outputValues(12,i0) = 2.0 * w * x * (1.0 + z);
152 outputValues(13,i0) = 2.0 * x * y * (1.0 + z);
153 outputValues(14,i0) = 2.0 * y * w * (1.0 + z);
159 for (
int i0 = 0; i0 < dim0; i0++) {
160 x = inputPoints(i0,0);
161 y = inputPoints(i0,1);
162 z = inputPoints(i0,2);
166 outputValues(0, i0, 0) = -(2.0*w - 1.0 - 0.5*z)*(1.0 - z);
167 outputValues(0, i0, 1) = -(2.0*w - 1.0 - 0.5*z)*(1.0 - z);
168 outputValues(0, i0, 2) = -0.5*w*(2.0*w - 1.0 - 2.0*z);
170 outputValues(1, i0, 0) = (2.0*x - 1.0 - 0.5*z)*(1.0 - z);
171 outputValues(1, i0, 1) = 0.0;
172 outputValues(1, i0, 2) = -0.5*x*(2.0*x - 1.0 - 2.0*z);
174 outputValues(2, i0, 0) = 0.0;
175 outputValues(2, i0, 1) = (2.0*y - 1.0 - 0.5*z)*(1.0 - z);
176 outputValues(2, i0, 2) = -0.5*y*(2.0*y - 1.0 - 2.0*z);
178 outputValues(3, i0, 0) = -(2.0*w - 1.0 + 0.5*z)*(1.0 + z);
179 outputValues(3, i0, 1) = -(2.0*w - 1.0 + 0.5*z)*(1.0 + z);
180 outputValues(3, i0, 2) = 0.5*w*(2.0*w - 1.0 + 2.0*z);
182 outputValues(4, i0, 0) = (2.0*x - 1.0 + 0.5*z)*(1.0 + z);
183 outputValues(4, i0, 1) = 0.0;
184 outputValues(4, i0, 2) = 0.5*x*(2.0*x - 1.0 + 2.0*z);
186 outputValues(5, i0, 0) = 0.0;
187 outputValues(5, i0, 1) = (2.0*y - 1.0 + 0.5*z)*(1.0 + z);
188 outputValues(5, i0, 2) = 0.5*y*(2.0*y - 1.0 + 2.0*z);
190 outputValues(6, i0, 0) = 2.0*(w - x)*(1.0 - z);
191 outputValues(6, i0, 1) = -2.0*x*(1.0 - z);
192 outputValues(6, i0, 2) = -2.0*x*w;
194 outputValues(7, i0, 0) = 2.0*y*(1.0 - z);
195 outputValues(7, i0, 1) = 2.0*x*(1.0 - z);
196 outputValues(7, i0, 2) = -2.0*x*y;
198 outputValues(8, i0, 0) = -2.0*y*(1.0 - z);
199 outputValues(8, i0, 1) = 2.0*(w - y)*(1.0 - z);
200 outputValues(8, i0, 2) = -2.0*w*y;
202 outputValues(9, i0, 0) = -(1.0 - z*z);
203 outputValues(9, i0, 1) = -(1.0 - z*z);
204 outputValues(9, i0, 2) = -2.0*z*w;
206 outputValues(10,i0, 0) = (1.0 - z*z);
207 outputValues(10,i0, 1) = 0.0;
208 outputValues(10,i0, 2) = -2.0*z*x;
210 outputValues(11,i0, 0) = 0.0;
211 outputValues(11,i0, 1) = (1.0 - z*z);
212 outputValues(11,i0, 2) = -2.0*z*y;
214 outputValues(12,i0, 0) = 2.0*(w - x)*(1.0 + z);
215 outputValues(12,i0, 1) = -2.0*x*(1.0 + z);
216 outputValues(12,i0, 2) = 2.0*x*w;
218 outputValues(13,i0, 0) = 2.0*y*(1.0 + z);
219 outputValues(13,i0, 1) = 2.0*x*(1.0 + z);
220 outputValues(13,i0, 2) = 2.0*x*y;
222 outputValues(14,i0, 0) = -2.0*y*(1.0 + z);
223 outputValues(14,i0, 1) = 2.0*(w - y)*(1.0 + z);
224 outputValues(14,i0, 2) = 2.0*w*y;
230 TEUCHOS_TEST_FOR_EXCEPTION( (operatorType == OPERATOR_CURL), std::invalid_argument,
231 ">>> ERROR (Basis_HGRAD_WEDGE_I2_FEM): CURL is invalid operator for rank-0 (scalar) functions in 3D");
235 TEUCHOS_TEST_FOR_EXCEPTION( (operatorType == OPERATOR_DIV), std::invalid_argument,
236 ">>> ERROR (Basis_HGRAD_WEDGE_I2_FEM): DIV is invalid operator for rank-0 (scalar) functions in 3D");
240 for (
int i0 = 0; i0 < dim0; i0++) {
241 x = inputPoints(i0,0);
242 y = inputPoints(i0,1);
243 z = inputPoints(i0,2);
246 outputValues(0, i0, 0) = 2.0*(1.0 - z);
247 outputValues(0, i0, 1) = 2.0*(1.0 - z);
248 outputValues(0, i0, 2) = 2.0*w - 0.5 - z;
249 outputValues(0, i0, 3) = 2.0*(1.0-z);
250 outputValues(0, i0, 4) = 2.0*w -0.5 - z;
251 outputValues(0, i0, 5) = w;
253 outputValues(1, i0, 0) = 2.0*(1.0 - z);
254 outputValues(1, i0, 1) = 0.;
255 outputValues(1, i0, 2) = -2.0*x + 0.5 + z;
256 outputValues(1, i0, 3) = 0.;
257 outputValues(1, i0, 4) = 0.;
258 outputValues(1, i0, 5) = x;
260 outputValues(2, i0, 0) = 0.;
261 outputValues(2, i0, 1) = 0.;
262 outputValues(2, i0, 2) = 0.;
263 outputValues(2, i0, 3) = 2.0*(1.0 - z);
264 outputValues(2, i0, 4) = -2.0*y + 0.5 + z;
265 outputValues(2, i0, 5) = y;
267 outputValues(3, i0, 0) = 2.0*(1.0 + z);
268 outputValues(3, i0, 1) = 2.0*(1.0 + z);
269 outputValues(3, i0, 2) = -2.0*w + 0.5 - z;
270 outputValues(3, i0, 3) = 2.0*(1.0 + z);
271 outputValues(3, i0, 4) = -2.0*w + 0.5 - z;
272 outputValues(3, i0, 5) = w;
274 outputValues(4, i0, 0) = 2.0*(1.0 + z);
275 outputValues(4, i0, 1) = 0.;
276 outputValues(4, i0, 2) = 2.0*x - 0.5 + z;
277 outputValues(4, i0, 3) = 0.;
278 outputValues(4, i0, 4) = 0.;
279 outputValues(4, i0, 5) = x;
281 outputValues(5, i0, 0) = 0.;
282 outputValues(5, i0, 1) = 0.;
283 outputValues(5, i0, 2) = 0.;
284 outputValues(5, i0, 3) = 2.0*(1.0 + z);
285 outputValues(5, i0, 4) = 2.0*y - 0.5 + z;
286 outputValues(5, i0, 5) = y;
288 outputValues(6, i0, 0) = -4.0*(1.0 - z);
289 outputValues(6, i0, 1) = -2.0*(1.0 - z);
290 outputValues(6, i0, 2) = -2.0*(w - x);
291 outputValues(6, i0, 3) = 0.;
292 outputValues(6, i0, 4) = 2.0*x;
293 outputValues(6, i0, 5) = 0.;
295 outputValues(7, i0, 0) = 0.;
296 outputValues(7, i0, 1) = 2.0*(1.0 - z);
297 outputValues(7, i0, 2) = -2.0*y;
298 outputValues(7, i0, 3) = 0.;
299 outputValues(7, i0, 4) = -2.0*x;
300 outputValues(7, i0, 5) = 0.;
302 outputValues(8, i0, 0) = 0.;
303 outputValues(8, i0, 1) = -2.0*(1.0 - z);
304 outputValues(8, i0, 2) = 2.0*y;
305 outputValues(8, i0, 3) = -4.0*(1.0 - z);
306 outputValues(8, i0, 4) = -2.0*(w - y);
307 outputValues(8, i0, 5) = 0.;
309 outputValues(9, i0, 0) = 0.;
310 outputValues(9, i0, 1) = 0.;
311 outputValues(9, i0, 2) = 2.0*z;
312 outputValues(9, i0, 3) = 0.;
313 outputValues(9, i0, 4) = 2.0*z;
314 outputValues(9, i0, 5) = -2.0*w;
316 outputValues(10,i0, 0) = 0.;
317 outputValues(10,i0, 1) = 0.;
318 outputValues(10,i0, 2) = -2.0*z;
319 outputValues(10,i0, 3) = 0.;
320 outputValues(10,i0, 4) = 0.;
321 outputValues(10,i0, 5) = -2.0*x;
323 outputValues(11,i0, 0) = 0.;
324 outputValues(11,i0, 1) = 0.;
325 outputValues(11,i0, 2) = 0.;
326 outputValues(11,i0, 3) = 0.;
327 outputValues(11,i0, 4) = -2.0*z;
328 outputValues(11,i0, 5) = -2.0*y;
330 outputValues(12,i0, 0) = -4.0*(1.0 + z);
331 outputValues(12,i0, 1) = -2.0*(1.0 + z);
332 outputValues(12,i0, 2) = 2.0*(w - x);
333 outputValues(12,i0, 3) = 0.;
334 outputValues(12,i0, 4) = -2.0*x;
335 outputValues(12,i0, 5) = 0.;
337 outputValues(13,i0, 0) = 0.;
338 outputValues(13,i0, 1) = 2.0*(1.0 + z);
339 outputValues(13,i0, 2) = 2.0*y;
340 outputValues(13,i0, 3) = 0.;
341 outputValues(13,i0, 4) = 2.0*x;
342 outputValues(13,i0, 5) = 0.;
344 outputValues(14,i0, 0) = 0.;
345 outputValues(14,i0, 1) = -2.0*(1.0 + z);
346 outputValues(14,i0, 2) = -2.0*y;
347 outputValues(14,i0, 3) = -4.0*(1.0 + z);
348 outputValues(14,i0, 4) = 2.0*(w - y);
349 outputValues(14,i0, 5) = 0.;
355 for (
int i0 = 0; i0 < dim0; i0++) {
356 x = inputPoints(i0,0);
357 y = inputPoints(i0,1);
358 z = inputPoints(i0,2);
360 outputValues(0, i0, 0) = 0.0;
361 outputValues(0, i0, 1) = 0.0;
362 outputValues(0, i0, 2) = -2.0;
363 outputValues(0, i0, 3) = 0.0;
364 outputValues(0, i0, 4) = -2.0;
365 outputValues(0, i0, 5) = -1.0;
366 outputValues(0, i0, 6) = 0.0;
367 outputValues(0, i0, 7) = -2.0;
368 outputValues(0, i0, 8) = -1.0;
369 outputValues(0, i0, 9) = 0.0;
371 outputValues(1, i0, 0) = 0.0;
372 outputValues(1, i0, 1) = 0.0;
373 outputValues(1, i0, 2) = -2.0;
374 outputValues(1, i0, 3) = 0.0;
375 outputValues(1, i0, 4) = 0.0;
376 outputValues(1, i0, 5) = -1.0;
377 outputValues(1, i0, 6) = 0.0;
378 outputValues(1, i0, 7) = 0.0;
379 outputValues(1, i0, 8) = 0.0;
380 outputValues(1, i0, 9) = 0.0;
382 outputValues(2, i0, 0) = 0.0;
383 outputValues(2, i0, 1) = 0.0;
384 outputValues(2, i0, 2) = 0.0;
385 outputValues(2, i0, 3) = 0.0;
386 outputValues(2, i0, 4) = 0.0;
387 outputValues(2, i0, 5) = 0.0;
388 outputValues(2, i0, 6) = 0.0;
389 outputValues(2, i0, 7) = -2.0;
390 outputValues(2, i0, 8) = -1.0;
391 outputValues(2, i0, 9) = 0.0;
393 outputValues(3, i0, 0) = 0.0;
394 outputValues(3, i0, 1) = 0.0;
395 outputValues(3, i0, 2) = 2.0;
396 outputValues(3, i0, 3) = 0.0;
397 outputValues(3, i0, 4) = 2.0;
398 outputValues(3, i0, 5) = -1.0;
399 outputValues(3, i0, 6) = 0.0;
400 outputValues(3, i0, 7) = 2.0;
401 outputValues(3, i0, 8) = -1.0;
402 outputValues(3, i0, 9) = 0.0;
404 outputValues(4, i0, 0) = 0.0;
405 outputValues(4, i0, 1) = 0.0;
406 outputValues(4, i0, 2) = 2.0;
407 outputValues(4, i0, 3) = 0.0;
408 outputValues(4, i0, 4) = 0.0;
409 outputValues(4, i0, 5) = 1.0;
410 outputValues(4, i0, 6) = 0.0;
411 outputValues(4, i0, 7) = 0.0;
412 outputValues(4, i0, 8) = 0.0;
413 outputValues(4, i0, 9) = 0.0;
415 outputValues(5, i0, 0) = 0.0;
416 outputValues(5, i0, 1) = 0.0;
417 outputValues(5, i0, 2) = 0.0;
418 outputValues(5, i0, 3) = 0.0;
419 outputValues(5, i0, 4) = 0.0;
420 outputValues(5, i0, 5) = 0.0;
421 outputValues(5, i0, 6) = 0.0;
422 outputValues(5, i0, 7) = 2.0;
423 outputValues(5, i0, 8) = 1.0;
424 outputValues(5, i0, 9) = 0.0;
426 outputValues(6, i0, 0) = 0.0;
427 outputValues(6, i0, 1) = 0.0;
428 outputValues(6, i0, 2) = 4.0;
429 outputValues(6, i0, 3) = 0.0;
430 outputValues(6, i0, 4) = 2.0;
431 outputValues(6, i0, 5) = 0.0;
432 outputValues(6, i0, 6) = 0.0;
433 outputValues(6, i0, 7) = 0.0;
434 outputValues(6, i0, 8) = 0.0;
435 outputValues(6, i0, 9) = 0.0;
437 outputValues(7, i0, 0) = 0.0;
438 outputValues(7, i0, 1) = 0.0;
439 outputValues(7, i0, 2) = 0.0;
440 outputValues(7, i0, 3) = 0.0;
441 outputValues(7, i0, 4) = -2.0;
442 outputValues(7, i0, 5) = 0.0;
443 outputValues(7, i0, 6) = 0.0;
444 outputValues(7, i0, 7) = 0.0;
445 outputValues(7, i0, 8) = 0.0;
446 outputValues(7, i0, 9) = 0.0;
448 outputValues(8, i0, 0) = 0.0;
449 outputValues(8, i0, 1) = 0.0;
450 outputValues(8, i0, 2) = 0.0;
451 outputValues(8, i0, 3) = 0.0;
452 outputValues(8, i0, 4) = 2.0;
453 outputValues(8, i0, 5) = 0.0;
454 outputValues(8, i0, 6) = 0.0;
455 outputValues(8, i0, 7) = 4.0;
456 outputValues(8, i0, 8) = 0.0;
457 outputValues(8, i0, 9) = 0.0;
459 outputValues(9, i0, 0) = 0.0;
460 outputValues(9, i0, 1) = 0.0;
461 outputValues(9, i0, 2) = 0.0;
462 outputValues(9, i0, 3) = 0.0;
463 outputValues(9, i0, 4) = 0.0;
464 outputValues(9, i0, 5) = 2.0;
465 outputValues(9, i0, 6) = 0.0;
466 outputValues(9, i0, 7) = 0.0;
467 outputValues(9, i0, 8) = 2.0;
468 outputValues(9, i0, 9) = 0.0;
470 outputValues(10,i0, 0) = 0.0;
471 outputValues(10,i0, 1) = 0.0;
472 outputValues(10,i0, 2) = 0.0;
473 outputValues(10,i0, 3) = 0.0;
474 outputValues(10,i0, 4) = 0.0;
475 outputValues(10,i0, 5) = -2.0;
476 outputValues(10,i0, 6) = 0.0;
477 outputValues(10,i0, 7) = 0.0;
478 outputValues(10,i0, 8) = 0.0;
479 outputValues(10,i0, 9) = 0.0;
481 outputValues(11,i0, 0) = 0.0;
482 outputValues(11,i0, 1) = 0.0;
483 outputValues(11,i0, 2) = 0.0;
484 outputValues(11,i0, 3) = 0.0;
485 outputValues(11,i0, 4) = 0.0;
486 outputValues(11,i0, 5) = 0.0;
487 outputValues(11,i0, 6) = 0.0;
488 outputValues(11,i0, 7) = 0.0;
489 outputValues(11,i0, 8) = -2.0;
490 outputValues(11,i0, 9) = 0.0;
492 outputValues(12,i0, 0) = 0.0;
493 outputValues(12,i0, 1) = 0.0;
494 outputValues(12,i0, 2) = -4.0;
495 outputValues(12,i0, 3) = 0.0;
496 outputValues(12,i0, 4) = -2.0;
497 outputValues(12,i0, 5) = 0.0;
498 outputValues(12,i0, 6) = 0.0;
499 outputValues(12,i0, 7) = 0.0;
500 outputValues(12,i0, 8) = 0.0;
501 outputValues(12,i0, 9) = 0.0;
503 outputValues(13,i0, 0) = 0.0;
504 outputValues(13,i0, 1) = 0.0;
505 outputValues(13,i0, 2) = 0.0;
506 outputValues(13,i0, 3) = 0.0;
507 outputValues(13,i0, 4) = 2.0;
508 outputValues(13,i0, 5) = 0.0;
509 outputValues(13,i0, 6) = 0.0;
510 outputValues(13,i0, 7) = 0.0;
511 outputValues(13,i0, 8) = 0.0;
512 outputValues(13,i0, 9) = 0.0;
514 outputValues(14,i0, 0) = 0.0;
515 outputValues(14,i0, 1) = 0.0;
516 outputValues(14,i0, 2) = 0.0;
517 outputValues(14,i0, 3) = 0.0;
518 outputValues(14,i0, 4) = -2.0;
519 outputValues(14,i0, 5) = 0.0;
520 outputValues(14,i0, 6) = 0.0;
521 outputValues(14,i0, 7) = -4.0;
522 outputValues(14,i0, 8) = 0.0;
523 outputValues(14,i0, 9) = 0.0;
538 this -> basisCellTopology_.getDimension() );
539 for(
int dofOrd = 0; dofOrd <
this -> basisCardinality_; dofOrd++) {
540 for (
int i0 = 0; i0 < dim0; i0++) {
541 for(
int dkOrd = 0; dkOrd < DkCardinality; dkOrd++){
542 outputValues(dofOrd, i0, dkOrd) = 0.0;
551 ">>> ERROR (Basis_HGRAD_WEDGE_I2_FEM): Invalid operator type");
557 template<
class Scalar,
class ArrayScalar>
559 const ArrayScalar & inputPoints,
560 const ArrayScalar & cellVertices,
562 TEUCHOS_TEST_FOR_EXCEPTION( (
true), std::logic_error,
563 ">>> ERROR (Basis_HGRAD_WEDGE_I2_FEM): FEM Basis calling an FVD member function");
void initializeTags()
Initializes tagToOrdinal_ and ordinalToTag_ lookup arrays.
void setOrdinalTagData(std::vector< std::vector< std::vector< int > > > &tagToOrdinal, std::vector< std::vector< int > > &ordinalToTag, const int *tags, const int basisCard, const int tagSize, const int posScDim, const int posScOrd, const int posDfOrd)
Fills ordinalToTag_ and tagToOrdinal_ by basis-specific tag data.
void getValues(ArrayScalar &outputValues, const ArrayScalar &inputPoints, const EOperator operatorType) const
FEM basis evaluation on a reference Wedge cell.
EOperator
Enumeration of primitive operators available in Intrepid. Primitive operators act on reconstructed fu...
int getDkCardinality(const EOperator operatorType, const int spaceDim)
Returns cardinality of Dk, i.e., the number of all derivatives of order k.
int isValidOperator(const EOperator operatorType)
Verifies validity of an operator enum.
Basis_HGRAD_WEDGE_I2_FEM()
Constructor.