51 template<
class Scalar,
56 const ArrayInData & inputData,
57 const ArrayInFields & inputFields){
58 #ifdef HAVE_INTREPID_DEBUG
59 std::string errmsg =
">>> ERROR (ArrayTools::crossProductDataField):";
67 TEUCHOS_TEST_FOR_EXCEPTION( !requireRankRange(errmsg, inputData, 3, 3),
68 std::invalid_argument, errmsg);
69 TEUCHOS_TEST_FOR_EXCEPTION( !requireDimensionRange(errmsg, inputData, 2, 2,3),
70 std::invalid_argument, errmsg);
72 TEUCHOS_TEST_FOR_EXCEPTION( !requireRankRange(errmsg, inputFields, 3,4), std::invalid_argument, errmsg);
73 TEUCHOS_TEST_FOR_EXCEPTION( !requireDimensionRange(errmsg, inputFields, getrank(inputFields)-1, 2,3),
74 std::invalid_argument, errmsg);
76 TEUCHOS_TEST_FOR_EXCEPTION( !requireRankRange(errmsg, outputFields, inputData.dimension(2)+1, inputData.dimension(2)+1),
77 std::invalid_argument, errmsg);
86 if( getrank(inputFields) == 4) {
88 TEUCHOS_TEST_FOR_EXCEPTION( !requireDimensionMatch(errmsg, inputData, 0,1,2, inputFields, 0,2,3),
89 std::invalid_argument, errmsg);
93 TEUCHOS_TEST_FOR_EXCEPTION( !requireDimensionMatch(errmsg, inputData, 1,2, inputFields, 1,2),
94 std::invalid_argument, errmsg);
99 if(inputData.dimension(2) == 2) {
101 TEUCHOS_TEST_FOR_EXCEPTION( !requireDimensionMatch(errmsg, outputFields, 0,2, inputData, 0,1),
102 std::invalid_argument, errmsg);
106 TEUCHOS_TEST_FOR_EXCEPTION( !requireDimensionMatch(errmsg, outputFields, 0,2,3, inputData, 0,1,2),
107 std::invalid_argument, errmsg);
112 if(inputData.dimension(2) == 2) {
114 if(getrank(inputFields) == 4){
116 TEUCHOS_TEST_FOR_EXCEPTION( !requireDimensionMatch(errmsg, outputFields, 0,1,2, inputFields, 0,1,2),
117 std::invalid_argument, errmsg);
121 TEUCHOS_TEST_FOR_EXCEPTION( !requireDimensionMatch(errmsg, outputFields, 1,2, inputFields, 0,1),
122 std::invalid_argument, errmsg);
127 if(getrank(inputFields) == 4){
129 TEUCHOS_TEST_FOR_EXCEPTION( !requireDimensionMatch(errmsg, outputFields, inputFields),
130 std::invalid_argument, errmsg);
134 TEUCHOS_TEST_FOR_EXCEPTION( !requireDimensionMatch(errmsg, outputFields, 1,2,3, inputFields, 0,1,2),
135 std::invalid_argument, errmsg);
139 ArrayWrapper<Scalar,ArrayOutFields, Rank<ArrayOutFields >::value,
false>outputFieldsWrap(outputFields);
140 ArrayWrapper<Scalar,ArrayInData, Rank<ArrayInData >::value,
true>inputDataWrap(inputData);
141 ArrayWrapper<Scalar,ArrayInFields, Rank<ArrayInFields >::value,
true>inputFieldsWrap(inputFields);
144 if(inputData.dimension(2) == 3) {
147 if(getrank(inputFields) == 4){
149 for(
size_t cell = 0; cell < static_cast<size_t>(outputFields.dimension(0)); cell++){
150 for(
size_t field = 0; field < static_cast<size_t>(outputFields.dimension(1)); field++){
151 for(
size_t point = 0; point < static_cast<size_t>(outputFields.dimension(2)); point++){
153 outputFieldsWrap(cell, field, point, 0) = \
154 inputDataWrap(cell, point, 1)*inputFieldsWrap(cell, field, point, 2) -
155 inputDataWrap(cell, point, 2)*inputFieldsWrap(cell, field, point, 1);
157 outputFieldsWrap(cell, field, point, 1) = \
158 inputDataWrap(cell, point, 2)*inputFieldsWrap(cell, field, point, 0) -
159 inputDataWrap(cell, point, 0)*inputFieldsWrap(cell, field, point, 2);
161 outputFieldsWrap(cell, field, point, 2) = \
162 inputDataWrap(cell, point, 0)*inputFieldsWrap(cell, field, point, 1) -
163 inputDataWrap(cell, point, 1)*inputFieldsWrap(cell, field, point, 0);
169 else if(getrank(inputFields) == 3){
171 for(
size_t cell = 0; cell < static_cast<size_t>(outputFields.dimension(0)); cell++){
172 for(
size_t field = 0; field < static_cast<size_t>(outputFields.dimension(1)); field++){
173 for(
size_t point = 0; point < static_cast<size_t>(outputFields.dimension(2)); point++){
175 outputFieldsWrap(cell, field, point, 0) = \
176 inputDataWrap(cell, point, 1)*inputFieldsWrap(field, point, 2) -
177 inputDataWrap(cell, point, 2)*inputFieldsWrap(field, point, 1);
179 outputFieldsWrap(cell, field, point, 1) = \
180 inputDataWrap(cell, point, 2)*inputFieldsWrap(field, point, 0) -
181 inputDataWrap(cell, point, 0)*inputFieldsWrap(field, point, 2);
183 outputFieldsWrap(cell, field, point, 2) = \
184 inputDataWrap(cell, point, 0)*inputFieldsWrap(field, point, 1) -
185 inputDataWrap(cell, point, 1)*inputFieldsWrap(field, point, 0);
191 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::invalid_argument,
192 ">>> ERROR (ArrayTools::crossProductDataField): inputFields rank 3 or 4 required.")
196 else if(inputData.dimension(2) == 2){
199 if(getrank(inputFields) == 4){
201 for(
size_t cell = 0; cell < static_cast<size_t>(outputFields.dimension(0)); cell++){
202 for(
size_t field = 0; field < static_cast<size_t>(outputFields.dimension(1)); field++){
203 for(
size_t point = 0; point < static_cast<size_t>(outputFields.dimension(2)); point++){
204 outputFieldsWrap(cell, field, point) = \
205 inputDataWrap(cell, point, 0)*inputFieldsWrap(cell, field, point, 1) -
206 inputDataWrap(cell, point, 1)*inputFieldsWrap(cell, field, point, 0);
212 else if(getrank(inputFields) == 3) {
214 for(
size_t cell = 0; cell < static_cast<size_t>(outputFields.dimension(0)); cell++){
215 for(
size_t field = 0; field < static_cast<size_t>(outputFields.dimension(1)); field++){
216 for(
size_t point = 0; point < static_cast<size_t>(outputFields.dimension(2)); point++){
217 outputFieldsWrap(cell, field, point) = \
218 inputDataWrap(cell, point, 0)*inputFieldsWrap(field, point, 1) -
219 inputDataWrap(cell, point, 1)*inputFieldsWrap(field, point, 0);
227 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::invalid_argument,
228 ">>> ERROR (ArrayTools::crossProductDataField): spatial dimension 2 or 3 required.")
234 template<
class Scalar,
236 class ArrayInDataLeft,
237 class ArrayInDataRight>
239 const ArrayInDataLeft & inputDataLeft,
240 const ArrayInDataRight & inputDataRight){
243 #ifdef HAVE_INTREPID_DEBUG
244 std::string errmsg =
">>> ERROR (ArrayTools::crossProductDataData):";
252 TEUCHOS_TEST_FOR_EXCEPTION( !requireRankRange(errmsg, inputDataLeft, 3,3),
253 std::invalid_argument, errmsg);
254 TEUCHOS_TEST_FOR_EXCEPTION( !requireDimensionRange(errmsg, inputDataLeft, 2, 2,3),
255 std::invalid_argument, errmsg);
257 TEUCHOS_TEST_FOR_EXCEPTION( !requireRankRange(errmsg, inputDataRight, 2,3),
258 std::invalid_argument, errmsg);
259 TEUCHOS_TEST_FOR_EXCEPTION( !requireDimensionRange(errmsg, inputDataRight, getrank(inputDataRight)-1, 2,3),
260 std::invalid_argument, errmsg);
262 TEUCHOS_TEST_FOR_EXCEPTION( !requireRankRange(errmsg, outputData, inputDataLeft.dimension(2), inputDataLeft.dimension(2)),
263 std::invalid_argument, errmsg);
272 if( getrank(inputDataRight) == 3) {
274 TEUCHOS_TEST_FOR_EXCEPTION( !requireDimensionMatch(errmsg, inputDataLeft, inputDataRight),
275 std::invalid_argument, errmsg);
279 TEUCHOS_TEST_FOR_EXCEPTION( !requireDimensionMatch(errmsg, inputDataLeft, 1,2, inputDataRight, 0,1),
280 std::invalid_argument, errmsg);
285 if(inputDataLeft.dimension(2) == 2){
287 TEUCHOS_TEST_FOR_EXCEPTION( !requireDimensionMatch(errmsg, inputDataLeft, 0,1, outputData, 0,1),
288 std::invalid_argument, errmsg);
292 TEUCHOS_TEST_FOR_EXCEPTION( !requireDimensionMatch(errmsg, inputDataLeft, outputData),
293 std::invalid_argument, errmsg);
298 if(inputDataLeft.dimension(2) == 2) {
300 if(getrank(inputDataRight) == 3){
302 TEUCHOS_TEST_FOR_EXCEPTION( !requireDimensionMatch(errmsg, outputData, 0,1, inputDataRight, 0,1),
303 std::invalid_argument, errmsg);
307 TEUCHOS_TEST_FOR_EXCEPTION( !requireDimensionMatch(errmsg, outputData, 1, inputDataRight, 0),
308 std::invalid_argument, errmsg);
313 if(getrank(inputDataRight) == 3){
315 TEUCHOS_TEST_FOR_EXCEPTION( !requireDimensionMatch(errmsg, outputData, inputDataRight),
316 std::invalid_argument, errmsg);
320 TEUCHOS_TEST_FOR_EXCEPTION( !requireDimensionMatch(errmsg, outputData, 1,2, inputDataRight, 0,1),
321 std::invalid_argument, errmsg);
327 ArrayWrapper<Scalar,ArrayOutData, Rank<ArrayOutData >::value,
false>outputDataWrap(outputData);
328 ArrayWrapper<Scalar,ArrayInDataLeft, Rank<ArrayInDataLeft >::value,
true>inputDataLeftWrap(inputDataLeft);
329 ArrayWrapper<Scalar,ArrayInDataRight, Rank<ArrayInDataRight >::value,
true>inputDataRightWrap(inputDataRight);
331 if(inputDataLeft.dimension(2) == 3) {
334 if(getrank(inputDataRight) == 3){
336 for(
size_t cell = 0; cell < (size_t)inputDataLeft.dimension(0); cell++){
337 for(
size_t point = 0; point < (size_t)inputDataLeft.dimension(1); point++){
339 outputDataWrap(cell, point, 0) = \
340 inputDataLeftWrap(cell, point, 1)*inputDataRightWrap(cell, point, 2) -
341 inputDataLeftWrap(cell, point, 2)*inputDataRightWrap(cell, point, 1);
343 outputDataWrap(cell, point, 1) = \
344 inputDataLeftWrap(cell, point, 2)*inputDataRightWrap(cell, point, 0) -
345 inputDataLeftWrap(cell, point, 0)*inputDataRightWrap(cell, point, 2);
347 outputDataWrap(cell, point, 2) = \
348 inputDataLeftWrap(cell, point, 0)*inputDataRightWrap(cell, point, 1) -
349 inputDataLeftWrap(cell, point, 1)*inputDataRightWrap(cell, point, 0);
354 else if(getrank(inputDataRight) == 2){
356 for(
size_t cell = 0; cell < (size_t)inputDataLeft.dimension(0); cell++){
357 for(
size_t point = 0; point < (size_t)inputDataLeft.dimension(1); point++){
359 outputDataWrap(cell, point, 0) = \
360 inputDataLeftWrap(cell, point, 1)*inputDataRightWrap(point, 2) -
361 inputDataLeftWrap(cell, point, 2)*inputDataRightWrap(point, 1);
363 outputDataWrap(cell, point, 1) = \
364 inputDataLeftWrap(cell, point, 2)*inputDataRightWrap(point, 0) -
365 inputDataLeftWrap(cell, point, 0)*inputDataRightWrap(point, 2);
367 outputDataWrap(cell, point, 2) = \
368 inputDataLeftWrap(cell, point, 0)*inputDataRightWrap(point, 1) -
369 inputDataLeftWrap(cell, point, 1)*inputDataRightWrap(point, 0);
374 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::invalid_argument,
375 ">>> ERROR (ArrayTools::crossProductDataData): inputDataRight rank 2 or 3 required.")
379 else if(inputDataLeft.dimension(2) == 2){
382 if(getrank(inputDataRight) == 3){
384 for(
size_t cell = 0; cell < (size_t)inputDataLeft.dimension(0); cell++){
385 for(
size_t point = 0; point < (size_t)inputDataLeft.dimension(1); point++){
386 outputDataWrap(cell, point) = \
387 inputDataLeftWrap(cell, point, 0)*inputDataRightWrap(cell, point, 1) -
388 inputDataLeftWrap(cell, point, 1)*inputDataRightWrap(cell, point, 0);
393 else if(getrank(inputDataRight) == 2) {
395 for(
size_t cell = 0; cell < (size_t)inputDataLeft.dimension(0); cell++){
396 for(
size_t point = 0; point < (size_t)inputDataLeft.dimension(1); point++){
397 outputDataWrap(cell, point) = \
398 inputDataLeftWrap(cell, point, 0)*inputDataRightWrap(point, 1) -
399 inputDataLeftWrap(cell, point, 1)*inputDataRightWrap(point, 0);
406 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::invalid_argument,
407 ">>> ERROR (ArrayTools::crossProductDataData): spatial dimension 2 or 3 required.")
413 template<
class Scalar,
414 class ArrayOutFields,
418 const ArrayInData & inputData,
419 const ArrayInFields & inputFields){
421 #ifdef HAVE_INTREPID_DEBUG
422 std::string errmsg =
">>> ERROR (ArrayTools::outerProductDataField):";
430 TEUCHOS_TEST_FOR_EXCEPTION( !requireRankRange(errmsg, inputData, 3,3),
431 std::invalid_argument, errmsg);
432 TEUCHOS_TEST_FOR_EXCEPTION( !requireDimensionRange(errmsg, inputData, 2, 2,3),
433 std::invalid_argument, errmsg);
435 TEUCHOS_TEST_FOR_EXCEPTION( !requireRankRange(errmsg, inputFields, 3,4), std::invalid_argument, errmsg);
436 TEUCHOS_TEST_FOR_EXCEPTION( !requireDimensionRange(errmsg, inputFields, getrank(inputFields)-1, 2,3),
437 std::invalid_argument, errmsg);
439 TEUCHOS_TEST_FOR_EXCEPTION( !requireRankRange(errmsg, outputFields, 5,5), std::invalid_argument, errmsg);
440 TEUCHOS_TEST_FOR_EXCEPTION( !requireDimensionRange(errmsg, outputFields, 3, 2,3),
441 std::invalid_argument, errmsg);
442 TEUCHOS_TEST_FOR_EXCEPTION( !requireDimensionRange(errmsg, outputFields, 4, 2,3),
443 std::invalid_argument, errmsg);
452 TEUCHOS_TEST_FOR_EXCEPTION( !requireDimensionMatch(errmsg,
453 outputFields, 0,2,3,4,
455 std::invalid_argument, errmsg);
459 if( getrank(inputFields) == 4) {
461 TEUCHOS_TEST_FOR_EXCEPTION( !requireDimensionMatch(errmsg,
464 std::invalid_argument, errmsg);
466 TEUCHOS_TEST_FOR_EXCEPTION( !requireDimensionMatch(errmsg,
467 outputFields, 0,1,2,3,4,
468 inputFields, 0,1,2,3,3),
469 std::invalid_argument, errmsg);
473 TEUCHOS_TEST_FOR_EXCEPTION( !requireDimensionMatch(errmsg,
476 std::invalid_argument, errmsg);
478 TEUCHOS_TEST_FOR_EXCEPTION( !requireDimensionMatch(errmsg,
479 outputFields, 1,2,3,4,
480 inputFields, 0,1,2,2),
481 std::invalid_argument, errmsg);
484 ArrayWrapper<Scalar,ArrayOutFields, Rank<ArrayOutFields >::value,
false>outputFieldsWrap(outputFields);
485 ArrayWrapper<Scalar,ArrayInData, Rank<ArrayInData >::value,
true>inputDataWrap(inputData);
486 ArrayWrapper<Scalar,ArrayInFields, Rank<ArrayInFields >::value,
true>inputFieldsWrap(inputFields);
489 if(getrank(inputFields) == 4){
491 for(
size_t cell = 0; cell < (size_t)outputFields.dimension(0); cell++){
492 for(
size_t field = 0; field < (size_t)outputFields.dimension(1); field++){
493 for(
size_t point = 0; point < (size_t)outputFields.dimension(2); point++){
494 for(
size_t row = 0; row < (size_t)outputFields.dimension(3); row++){
495 for(
size_t col = 0; col < (size_t)outputFields.dimension(4); col++){
496 outputFieldsWrap(cell, field, point, row, col) = \
497 inputDataWrap(cell, point, row)*inputFieldsWrap(cell, field, point, col);
505 else if(getrank(inputFields) == 3){
507 for(
size_t cell = 0; cell < (size_t)outputFields.dimension(0); cell++){
508 for(
size_t field = 0; field < (size_t)outputFields.dimension(1); field++){
509 for(
size_t point = 0; point < (size_t)outputFields.dimension(2); point++){
510 for(
size_t row = 0; row < (size_t)outputFields.dimension(3); row++){
511 for(
size_t col = 0; col < (size_t)outputFields.dimension(4); col++){
512 outputFieldsWrap(cell, field, point, row, col) = \
513 inputDataWrap(cell, point, row)*inputFieldsWrap(field, point, col);
521 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::invalid_argument,
522 ">>> ERROR (ArrayTools::outerProductDataField): inputFields rank 3 or 4 required.")
528 template<
class Scalar,
530 class ArrayInDataLeft,
531 class ArrayInDataRight>
533 const ArrayInDataLeft & inputDataLeft,
534 const ArrayInDataRight & inputDataRight){
536 #ifdef HAVE_INTREPID_DEBUG
537 std::string errmsg =
">>> ERROR (ArrayTools::outerProductDataData):";
545 TEUCHOS_TEST_FOR_EXCEPTION( !requireRankRange(errmsg, inputDataLeft, 3,3),
546 std::invalid_argument, errmsg);
547 TEUCHOS_TEST_FOR_EXCEPTION( !requireDimensionRange(errmsg, inputDataLeft, 2, 2,3),
548 std::invalid_argument, errmsg);
550 TEUCHOS_TEST_FOR_EXCEPTION( !requireRankRange(errmsg, inputDataRight, 2,3),
551 std::invalid_argument, errmsg);
552 TEUCHOS_TEST_FOR_EXCEPTION( !requireDimensionRange(errmsg, inputDataRight, getrank(inputDataRight)-1, 2,3),
553 std::invalid_argument, errmsg);
555 TEUCHOS_TEST_FOR_EXCEPTION( !requireRankRange(errmsg, outputData, 4, 4), std::invalid_argument, errmsg);
556 TEUCHOS_TEST_FOR_EXCEPTION( !requireDimensionRange(errmsg, outputData, 2, 2,3),
557 std::invalid_argument, errmsg);
558 TEUCHOS_TEST_FOR_EXCEPTION( !requireDimensionRange(errmsg, outputData, 3, 2,3),
559 std::invalid_argument, errmsg);
568 TEUCHOS_TEST_FOR_EXCEPTION( !requireDimensionMatch(errmsg,
570 inputDataLeft, 0,1,2,2),
571 std::invalid_argument, errmsg);
575 if( getrank(inputDataRight) == 3) {
577 TEUCHOS_TEST_FOR_EXCEPTION( !requireDimensionMatch(errmsg, inputDataLeft, inputDataRight),
578 std::invalid_argument, errmsg);
580 TEUCHOS_TEST_FOR_EXCEPTION( !requireDimensionMatch(errmsg,
582 inputDataRight, 0,1,2,2),
583 std::invalid_argument, errmsg);
587 TEUCHOS_TEST_FOR_EXCEPTION( !requireDimensionMatch(errmsg,
589 inputDataRight, 0,1),
590 std::invalid_argument, errmsg);
592 TEUCHOS_TEST_FOR_EXCEPTION( !requireDimensionMatch(errmsg,
594 inputDataRight, 0,1,1),
595 std::invalid_argument, errmsg);
599 ArrayWrapper<Scalar,ArrayOutData, Rank<ArrayOutData >::value,
false>outputDataWrap(outputData);
600 ArrayWrapper<Scalar,ArrayInDataLeft, Rank<ArrayInDataLeft >::value,
true>inputDataLeftWrap(inputDataLeft);
601 ArrayWrapper<Scalar,ArrayInDataRight, Rank<ArrayInDataRight >::value,
true>inputDataRightWrap(inputDataRight);
604 if(getrank(inputDataRight) == 3){
606 for(
size_t cell = 0; cell <(size_t) inputDataLeft.dimension(0); cell++){
607 for(
size_t point = 0; point <(size_t) inputDataLeft.dimension(1); point++){
608 for(
size_t row = 0; row <(size_t) inputDataLeft.dimension(2); row++){
609 for(
size_t col = 0; col <(size_t) inputDataLeft.dimension(2); col++){
611 outputDataWrap(cell, point, row, col) = \
612 inputDataLeftWrap(cell, point, row)*inputDataRightWrap(cell, point, col);
619 else if(getrank(inputDataRight) == 2){
621 for(
size_t cell = 0; cell <(size_t) inputDataLeft.dimension(0); cell++){
622 for(
size_t point = 0; point <(size_t) inputDataLeft.dimension(1); point++){
623 for(
size_t row = 0; row <(size_t) inputDataLeft.dimension(2); row++){
624 for(
size_t col = 0; col <(size_t) inputDataLeft.dimension(2); col++){
626 outputDataWrap(cell, point, row, col) = \
627 inputDataLeftWrap(cell, point, row)*inputDataRightWrap(point, col);
634 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::invalid_argument,
635 ">>> ERROR (ArrayTools::crossProductDataData): inputDataRight rank 2 or 3 required.")
638 template<
class Scalar,
639 class ArrayOutFields,
643 const ArrayInData & inputData,
644 const ArrayInFields & inputFields,
645 const char transpose){
647 #ifdef HAVE_INTREPID_DEBUG
648 std::string errmsg =
">>> ERROR (ArrayTools::matvecProductDataField):";
656 TEUCHOS_TEST_FOR_EXCEPTION( !requireRankRange(errmsg, inputData, 2,4),
657 std::invalid_argument, errmsg);
658 if(getrank(inputData) > 2) {
659 TEUCHOS_TEST_FOR_EXCEPTION( !requireDimensionRange(errmsg, inputData, 2, 1,3),
660 std::invalid_argument, errmsg);
662 if(getrank(inputData) == 4) {
663 TEUCHOS_TEST_FOR_EXCEPTION( !requireDimensionRange(errmsg, inputData, 3, 1,3),
664 std::invalid_argument, errmsg);
667 TEUCHOS_TEST_FOR_EXCEPTION( !requireRankRange(errmsg, inputFields, 3,4), std::invalid_argument, errmsg);
668 TEUCHOS_TEST_FOR_EXCEPTION( !requireDimensionRange(errmsg, inputFields, getrank(inputFields)-1, 1,3),
669 std::invalid_argument, errmsg);
671 TEUCHOS_TEST_FOR_EXCEPTION( !requireRankRange(errmsg, outputFields, 4,4), std::invalid_argument, errmsg);
672 TEUCHOS_TEST_FOR_EXCEPTION( !requireDimensionRange(errmsg, outputFields, 3, 1,3),
673 std::invalid_argument, errmsg);
685 if(inputData.dimension(1) > 1){
686 TEUCHOS_TEST_FOR_EXCEPTION( !requireDimensionMatch(errmsg,
689 std::invalid_argument, errmsg);
691 if(getrank(inputData) == 2) {
692 TEUCHOS_TEST_FOR_EXCEPTION( !requireDimensionMatch(errmsg,
695 std::invalid_argument, errmsg);
697 if(getrank(inputData) == 3){
698 TEUCHOS_TEST_FOR_EXCEPTION( !requireDimensionMatch(errmsg,
701 std::invalid_argument, errmsg);
704 if(getrank(inputData) == 4){
705 TEUCHOS_TEST_FOR_EXCEPTION( !requireDimensionMatch(errmsg,
708 std::invalid_argument, errmsg);
713 if(getrank(inputFields) == 4) {
715 if(inputData.dimension(1) > 1){
716 TEUCHOS_TEST_FOR_EXCEPTION( !requireDimensionMatch(errmsg,
719 std::invalid_argument, errmsg);
721 if(getrank(inputData) == 2){
722 TEUCHOS_TEST_FOR_EXCEPTION( !requireDimensionMatch(errmsg,
725 std::invalid_argument, errmsg);
727 if(getrank(inputData) == 3){
728 TEUCHOS_TEST_FOR_EXCEPTION( !requireDimensionMatch(errmsg,
731 std::invalid_argument, errmsg);
733 if(getrank(inputData) == 4){
734 TEUCHOS_TEST_FOR_EXCEPTION( !requireDimensionMatch(errmsg,
737 std::invalid_argument, errmsg);
740 TEUCHOS_TEST_FOR_EXCEPTION( !requireDimensionMatch(errmsg, outputFields, inputFields),
741 std::invalid_argument, errmsg);
745 if(inputData.dimension(1) > 1){
746 TEUCHOS_TEST_FOR_EXCEPTION( !requireDimensionMatch(errmsg,
749 std::invalid_argument, errmsg);
751 if(getrank(inputData) == 3){
752 TEUCHOS_TEST_FOR_EXCEPTION( !requireDimensionMatch(errmsg,
755 std::invalid_argument, errmsg);
757 if(getrank(inputData) == 4){
758 TEUCHOS_TEST_FOR_EXCEPTION( !requireDimensionMatch(errmsg,
761 std::invalid_argument, errmsg);
764 TEUCHOS_TEST_FOR_EXCEPTION( !requireDimensionMatch(errmsg,
767 std::invalid_argument, errmsg);
771 ArrayWrapper<Scalar,ArrayOutFields, Rank<ArrayOutFields >::value,
false>outputFieldsWrap(outputFields);
772 ArrayWrapper<Scalar,ArrayInData, Rank<ArrayInData >::value,
true>inputDataWrap(inputData);
773 ArrayWrapper<Scalar,ArrayInFields, Rank<ArrayInFields >::value,
true>inputFieldsWrap(inputFields);
774 size_t dataRank = getrank(inputData);
775 size_t numDataPts = inputData.dimension(1);
776 size_t inRank = getrank(inputFields);
777 size_t numCells = outputFields.dimension(0);
778 size_t numFields = outputFields.dimension(1);
779 size_t numPoints = outputFields.dimension(2);
780 size_t matDim = outputFields.dimension(3);
789 for(
size_t cell = 0; cell < numCells; cell++) {
790 for(
size_t field = 0; field < numFields; field++) {
791 for(
size_t point = 0; point < numPoints; point++) {
792 for(
size_t row = 0; row < matDim; row++) {
793 outputFieldsWrap(cell, field, point, row) = \
794 inputDataWrap(cell, point)*inputFieldsWrap(cell, field, point, row);
802 for(
size_t cell = 0; cell < numCells; cell++) {
803 for(
size_t field = 0; field < numFields; field++) {
804 for(
size_t point = 0; point < numPoints; point++) {
805 for(
size_t row = 0; row < matDim; row++) {
806 outputFieldsWrap(cell, field, point, row) = \
807 inputDataWrap(cell, point, row)*inputFieldsWrap(cell, field, point, row);
815 if ((transpose ==
'n') || (transpose ==
'N')) {
816 for(
size_t cell = 0; cell < numCells; cell++){
817 for(
size_t field = 0; field < numFields; field++){
818 for(
size_t point = 0; point < numPoints; point++){
819 for(
size_t row = 0; row < matDim; row++){
820 outputFieldsWrap(cell, field, point, row) = 0.0;
821 for(
size_t col = 0; col < matDim; col++){
822 outputFieldsWrap(cell, field, point, row) += \
823 inputDataWrap(cell, point, row, col)*inputFieldsWrap(cell, field, point, col);
830 else if ((transpose ==
't') || (transpose ==
'T')) {
831 for(
size_t cell = 0; cell < numCells; cell++){
832 for(
size_t field = 0; field < numFields; field++){
833 for(
size_t point = 0; point < numPoints; point++){
834 for(
size_t row = 0; row < matDim; row++){
835 outputFieldsWrap(cell, field, point, row) = 0.0;
836 for(
size_t col = 0; col < matDim; col++){
837 outputFieldsWrap(cell, field, point, row) += \
838 inputDataWrap(cell, point, col, row)*inputFieldsWrap(cell, field, point, col);
846 TEUCHOS_TEST_FOR_EXCEPTION( !( (transpose ==
'n') || (transpose ==
'N') || (transpose ==
't') || (transpose ==
'T') ), std::invalid_argument,
847 ">>> ERROR (ArrayTools::matvecProductDataField): The transpose flag must be 'n', 'N', 't' or 'T'.");
852 TEUCHOS_TEST_FOR_EXCEPTION( !( (dataRank == 2) || (dataRank == 3) || (dataRank == 4) ), std::invalid_argument,
853 ">>> ERROR (ArrayTools::matvecProductDataField): inputData rank 2, 3 or 4 required.")
859 for(
size_t cell = 0; cell < numCells; cell++) {
860 for(
size_t field = 0; field < numFields; field++) {
861 for(
size_t point = 0; point < numPoints; point++) {
862 for(
size_t row = 0; row < matDim; row++) {
863 outputFieldsWrap(cell, field, point, row) = \
864 inputDataWrap(cell, 0)*inputFieldsWrap(cell, field, point, row);
872 for(
size_t cell = 0; cell < numCells; cell++) {
873 for(
size_t field = 0; field < numFields; field++) {
874 for(
size_t point = 0; point < numPoints; point++) {
875 for(
size_t row = 0; row < matDim; row++) {
876 outputFieldsWrap(cell, field, point, row) = \
877 inputDataWrap(cell, 0, row)*inputFieldsWrap(cell, field, point, row);
885 if ((transpose ==
'n') || (transpose ==
'N')) {
886 for(
size_t cell = 0; cell < numCells; cell++){
887 for(
size_t field = 0; field < numFields; field++){
888 for(
size_t point = 0; point < numPoints; point++){
889 for(
size_t row = 0; row < matDim; row++){
890 outputFieldsWrap(cell, field, point, row) = 0.0;
891 for(
size_t col = 0; col < matDim; col++){
892 outputFieldsWrap(cell, field, point, row) += \
893 inputDataWrap(cell, 0, row, col)*inputFieldsWrap(cell, field, point, col);
900 else if ((transpose ==
't') || (transpose ==
'T')) {
901 for(
size_t cell = 0; cell < numCells; cell++){
902 for(
size_t field = 0; field < numFields; field++){
903 for(
size_t point = 0; point < numPoints; point++){
904 for(
size_t row = 0; row < matDim; row++){
905 outputFieldsWrap(cell, field, point, row) = 0.0;
906 for(
size_t col = 0; col < matDim; col++){
907 outputFieldsWrap(cell, field, point, row) += \
908 inputDataWrap(cell, 0, col, row)*inputFieldsWrap(cell, field, point, col);
916 TEUCHOS_TEST_FOR_EXCEPTION( !( (transpose ==
'n') || (transpose ==
'N') || (transpose ==
't') || (transpose ==
'T') ), std::invalid_argument,
917 ">>> ERROR (ArrayTools::matvecProductDataField): The transpose flag must be 'n', 'N', 't' or 'T'.");
922 TEUCHOS_TEST_FOR_EXCEPTION( !( (dataRank == 2) || (dataRank == 3) || (dataRank == 4) ), std::invalid_argument,
923 ">>> ERROR (ArrayTools::matvecProductDataField): inputData rank 2, 3 or 4 required.")
930 else if(inRank == 3) {
935 for(
size_t cell = 0; cell < numCells; cell++) {
936 for(
size_t field = 0; field < numFields; field++) {
937 for(
size_t point = 0; point < numPoints; point++) {
938 for(
size_t row = 0; row < matDim; row++) {
939 outputFieldsWrap(cell, field, point, row) = \
940 inputDataWrap(cell, point)*inputFieldsWrap(field, point, row);
948 for(
size_t cell = 0; cell < numCells; cell++) {
949 for(
size_t field = 0; field < numFields; field++) {
950 for(
size_t point = 0; point < numPoints; point++) {
951 for(
size_t row = 0; row < matDim; row++) {
952 outputFieldsWrap(cell, field, point, row) = \
953 inputDataWrap(cell, point, row)*inputFieldsWrap(field, point, row);
961 if ((transpose ==
'n') || (transpose ==
'N')) {
962 for(
size_t cell = 0; cell < numCells; cell++){
963 for(
size_t field = 0; field < numFields; field++){
964 for(
size_t point = 0; point < numPoints; point++){
965 for(
size_t row = 0; row < matDim; row++){
966 outputFieldsWrap(cell, field, point, row) = 0.0;
967 for(
size_t col = 0; col < matDim; col++){
968 outputFieldsWrap(cell, field, point, row) += \
969 inputDataWrap(cell, point, row, col)*inputFieldsWrap(field, point, col);
976 else if ((transpose ==
't') || (transpose ==
'T')) {
977 for(
size_t cell = 0; cell < numCells; cell++){
978 for(
size_t field = 0; field < numFields; field++){
979 for(
size_t point = 0; point < numPoints; point++){
980 for(
size_t row = 0; row < matDim; row++){
981 outputFieldsWrap(cell, field, point, row) = 0.0;
982 for(
size_t col = 0; col < matDim; col++){
983 outputFieldsWrap(cell, field, point, row) += \
984 inputDataWrap(cell, point, col, row)*inputFieldsWrap(field, point, col);
992 TEUCHOS_TEST_FOR_EXCEPTION( !( (transpose ==
'n') || (transpose ==
'N') || (transpose ==
't') || (transpose ==
'T') ), std::invalid_argument,
993 ">>> ERROR (ArrayTools::matvecProductDataField): The transpose flag must be 'n', 'N', 't' or 'T'.");
998 TEUCHOS_TEST_FOR_EXCEPTION( !( (dataRank == 2) || (dataRank == 3) || (dataRank == 4) ), std::invalid_argument,
999 ">>> ERROR (ArrayTools::matvecProductDataField): inputData rank 2, 3 or 4 required.")
1005 for(
size_t cell = 0; cell < numCells; cell++) {
1006 for(
size_t field = 0; field < numFields; field++) {
1007 for(
size_t point = 0; point < numPoints; point++) {
1008 for(
size_t row = 0; row < matDim; row++) {
1009 outputFieldsWrap(cell, field, point, row) = \
1010 inputDataWrap(cell, 0)*inputFieldsWrap(field, point, row);
1018 for(
size_t cell = 0; cell < numCells; cell++) {
1019 for(
size_t field = 0; field < numFields; field++) {
1020 for(
size_t point = 0; point < numPoints; point++) {
1021 for(
size_t row = 0; row < matDim; row++) {
1022 outputFieldsWrap(cell, field, point, row) = \
1023 inputDataWrap(cell, 0, row)*inputFieldsWrap(field, point, row);
1031 if ((transpose ==
'n') || (transpose ==
'N')) {
1032 for(
size_t cell = 0; cell < numCells; cell++){
1033 for(
size_t field = 0; field < numFields; field++){
1034 for(
size_t point = 0; point < numPoints; point++){
1035 for(
size_t row = 0; row < matDim; row++){
1036 outputFieldsWrap(cell, field, point, row) = 0.0;
1037 for(
size_t col = 0; col < matDim; col++){
1038 outputFieldsWrap(cell, field, point, row) += \
1039 inputDataWrap(cell, 0, row, col)*inputFieldsWrap(field, point, col);
1046 else if ((transpose ==
't') || (transpose ==
'T')) {
1047 for(
size_t cell = 0; cell < numCells; cell++){
1048 for(
size_t field = 0; field < numFields; field++){
1049 for(
size_t point = 0; point < numPoints; point++){
1050 for(
size_t row = 0; row < matDim; row++){
1051 outputFieldsWrap(cell, field, point, row) = 0.0;
1052 for(
size_t col = 0; col < matDim; col++){
1053 outputFieldsWrap(cell, field, point, row) += \
1054 inputDataWrap(cell, 0, col, row)*inputFieldsWrap(field, point, col);
1062 TEUCHOS_TEST_FOR_EXCEPTION( !( (transpose ==
'n') || (transpose ==
'N') || (transpose ==
't') || (transpose ==
'T') ), std::invalid_argument,
1063 ">>> ERROR (ArrayTools::matvecProductDataField): The transpose flag must be 'n', 'N', 't' or 'T'.");
1068 TEUCHOS_TEST_FOR_EXCEPTION( !( (dataRank == 2) || (dataRank == 3) || (dataRank == 4) ), std::invalid_argument,
1069 ">>> ERROR (ArrayTools::matvecProductDataField): inputData rank 2, 3 or 4 required.")
1074 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::invalid_argument,
1075 ">>> ERROR (ArrayTools::matvecProductDataField): inputFields rank 3 or 4 required.")
1081 template<
class Scalar,
1083 class ArrayInDataLeft,
1084 class ArrayInDataRight>
1086 const ArrayInDataLeft & inputDataLeft,
1087 const ArrayInDataRight & inputDataRight,
1088 const char transpose){
1090 #ifdef HAVE_INTREPID_DEBUG
1091 std::string errmsg =
">>> ERROR (ArrayTools::matvecProductDataData):";
1099 TEUCHOS_TEST_FOR_EXCEPTION( !requireRankRange(errmsg, inputDataLeft, 2,4),
1100 std::invalid_argument, errmsg);
1101 if(getrank(inputDataLeft) > 2) {
1102 TEUCHOS_TEST_FOR_EXCEPTION( !requireDimensionRange(errmsg, inputDataLeft, 2, 1,3),
1103 std::invalid_argument, errmsg);
1105 if(getrank(inputDataLeft) == 4) {
1106 TEUCHOS_TEST_FOR_EXCEPTION( !requireDimensionRange(errmsg, inputDataLeft, 3, 1,3),
1107 std::invalid_argument, errmsg);
1110 TEUCHOS_TEST_FOR_EXCEPTION( !requireRankRange(errmsg, inputDataRight, 2,3),
1111 std::invalid_argument, errmsg);
1112 TEUCHOS_TEST_FOR_EXCEPTION( !requireDimensionRange(errmsg, inputDataRight, getrank(inputDataRight)-1, 1,3),
1113 std::invalid_argument, errmsg);
1115 TEUCHOS_TEST_FOR_EXCEPTION( !requireRankRange(errmsg, outputData, 3,3), std::invalid_argument, errmsg);
1116 TEUCHOS_TEST_FOR_EXCEPTION( !requireDimensionRange(errmsg, outputData, 2, 1,3),
1117 std::invalid_argument, errmsg);
1129 if(inputDataLeft.dimension(1) > 1){
1130 TEUCHOS_TEST_FOR_EXCEPTION( !requireDimensionMatch(errmsg,
1133 std::invalid_argument, errmsg);
1135 if(getrank(inputDataLeft) == 2){
1136 TEUCHOS_TEST_FOR_EXCEPTION( !requireDimensionMatch(errmsg,
1139 std::invalid_argument, errmsg);
1141 if(getrank(inputDataLeft) == 3){
1142 TEUCHOS_TEST_FOR_EXCEPTION( !requireDimensionMatch(errmsg,
1144 inputDataLeft, 0,2),
1145 std::invalid_argument, errmsg);
1147 if(getrank(inputDataLeft) == 4){
1148 TEUCHOS_TEST_FOR_EXCEPTION( !requireDimensionMatch(errmsg,
1150 inputDataLeft, 0,2,3),
1151 std::invalid_argument, errmsg);
1156 if( getrank(inputDataRight) == 3) {
1158 if(inputDataLeft.dimension(1) > 1){
1159 TEUCHOS_TEST_FOR_EXCEPTION( !requireDimensionMatch(errmsg,
1162 std::invalid_argument, errmsg);
1164 if(getrank(inputDataLeft) == 2){
1165 TEUCHOS_TEST_FOR_EXCEPTION( !requireDimensionMatch(errmsg,
1168 std::invalid_argument, errmsg);
1170 if(getrank(inputDataLeft) == 3){
1171 TEUCHOS_TEST_FOR_EXCEPTION( !requireDimensionMatch(errmsg,
1173 inputDataRight, 0,2),
1174 std::invalid_argument, errmsg);
1176 if(getrank(inputDataLeft) == 4){
1177 TEUCHOS_TEST_FOR_EXCEPTION( !requireDimensionMatch(errmsg,
1178 inputDataLeft, 0,2,3,
1179 inputDataRight, 0,2,2),
1180 std::invalid_argument, errmsg);
1184 TEUCHOS_TEST_FOR_EXCEPTION( !requireDimensionMatch(errmsg, outputData, inputDataRight),
1185 std::invalid_argument, errmsg);
1189 if(inputDataLeft.dimension(1) > 1){
1190 TEUCHOS_TEST_FOR_EXCEPTION( !requireDimensionMatch(errmsg,
1193 std::invalid_argument, errmsg);
1195 if(getrank(inputDataLeft) == 3){
1196 TEUCHOS_TEST_FOR_EXCEPTION( !requireDimensionMatch(errmsg,
1199 std::invalid_argument, errmsg);
1201 if(getrank(inputDataLeft) == 4){
1202 TEUCHOS_TEST_FOR_EXCEPTION( !requireDimensionMatch(errmsg,
1204 inputDataRight, 1,1),
1205 std::invalid_argument, errmsg);
1208 TEUCHOS_TEST_FOR_EXCEPTION( !requireDimensionMatch(errmsg,
1210 inputDataRight, 0,1),
1211 std::invalid_argument, errmsg);
1215 ArrayWrapper<Scalar,ArrayOutData, Rank<ArrayOutData >::value,
false>outputDataWrap(outputData);
1216 ArrayWrapper<Scalar,ArrayInDataLeft, Rank<ArrayInDataLeft >::value,
true>inputDataLeftWrap(inputDataLeft);
1217 ArrayWrapper<Scalar,ArrayInDataRight, Rank<ArrayInDataRight >::value,
true>inputDataRightWrap(inputDataRight);
1218 size_t dataLeftRank = getrank(inputDataLeft);
1219 size_t numDataLeftPts = inputDataLeft.dimension(1);
1220 size_t dataRightRank = getrank(inputDataRight);
1221 size_t numCells = outputData.dimension(0);
1222 size_t numPoints = outputData.dimension(1);
1223 size_t matDim = outputData.dimension(2);
1228 if(dataRightRank == 3){
1229 if(numDataLeftPts != 1){
1231 switch(dataLeftRank){
1233 for(
size_t cell = 0; cell < numCells; cell++) {
1234 for(
size_t point = 0; point < numPoints; point++) {
1235 for(
size_t row = 0; row < matDim; row++) {
1236 outputDataWrap(cell, point, row) = \
1237 inputDataLeftWrap(cell, point)*inputDataRightWrap(cell, point, row);
1244 for(
size_t cell = 0; cell < numCells; cell++) {
1245 for(
size_t point = 0; point < numPoints; point++) {
1246 for(
size_t row = 0; row < matDim; row++) {
1247 outputDataWrap(cell, point, row) = \
1248 inputDataLeftWrap(cell, point, row)*inputDataRightWrap(cell, point, row);
1255 if ((transpose ==
'n') || (transpose ==
'N')) {
1256 for(
size_t cell = 0; cell < numCells; cell++){
1257 for(
size_t point = 0; point < numPoints; point++){
1258 for(
size_t row = 0; row < matDim; row++){
1259 outputDataWrap(cell, point, row) = 0.0;
1260 for(
size_t col = 0; col < matDim; col++){
1261 outputDataWrap(cell, point, row) += \
1262 inputDataLeftWrap(cell, point, row, col)*inputDataRightWrap(cell, point, col);
1268 else if ((transpose ==
't') || (transpose ==
'T')) {
1269 for(
size_t cell = 0; cell < numCells; cell++){
1270 for(
size_t point = 0; point < numPoints; point++){
1271 for(
size_t row = 0; row < matDim; row++){
1272 outputDataWrap(cell, point, row) = 0.0;
1273 for(
size_t col = 0; col < matDim; col++){
1274 outputDataWrap(cell, point, row) += \
1275 inputDataLeftWrap(cell, point, col, row)*inputDataRightWrap(cell, point, col);
1282 TEUCHOS_TEST_FOR_EXCEPTION( !( (transpose ==
'n') || (transpose ==
'N') || (transpose ==
't') || (transpose ==
'T') ), std::invalid_argument,
1283 ">>> ERROR (ArrayTools::matvecProductDataData): The transpose flag must be 'n', 'N', 't' or 'T'.");
1288 TEUCHOS_TEST_FOR_EXCEPTION( !( (dataLeftRank == 2) || (dataLeftRank == 3) || (dataLeftRank == 4) ), std::invalid_argument,
1289 ">>> ERROR (ArrayTools::matvecProductDataData): inputDataLeft rank 2, 3 or 4 required.")
1293 switch(dataLeftRank){
1295 for(
size_t cell = 0; cell < numCells; cell++) {
1296 for(
size_t point = 0; point < numPoints; point++) {
1297 for(
size_t row = 0; row < matDim; row++) {
1298 outputDataWrap(cell, point, row) = \
1299 inputDataLeftWrap(cell, 0)*inputDataRightWrap(cell, point, row);
1306 for(
size_t cell = 0; cell < numCells; cell++) {
1307 for(
size_t point = 0; point < numPoints; point++) {
1308 for(
size_t row = 0; row < matDim; row++) {
1309 outputDataWrap(cell, point, row) = \
1310 inputDataLeftWrap(cell, 0, row)*inputDataRightWrap(cell, point, row);
1317 if ((transpose ==
'n') || (transpose ==
'N')) {
1318 for(
size_t cell = 0; cell < numCells; cell++){
1319 for(
size_t point = 0; point < numPoints; point++){
1320 for(
size_t row = 0; row < matDim; row++){
1321 outputDataWrap(cell, point, row) = 0.0;
1322 for(
size_t col = 0; col < matDim; col++){
1323 outputDataWrap(cell, point, row) += \
1324 inputDataLeftWrap(cell, 0, row, col)*inputDataRightWrap(cell, point, col);
1330 else if ((transpose ==
't') || (transpose ==
'T')) {
1331 for(
size_t cell = 0; cell < numCells; cell++){
1332 for(
size_t point = 0; point < numPoints; point++){
1333 for(
size_t row = 0; row < matDim; row++){
1334 outputDataWrap(cell, point, row) = 0.0;
1335 for(
size_t col = 0; col < matDim; col++){
1336 outputDataWrap(cell, point, row) += \
1337 inputDataLeftWrap(cell, 0, col, row)*inputDataRightWrap(cell, point, col);
1344 TEUCHOS_TEST_FOR_EXCEPTION( !( (transpose ==
'n') || (transpose ==
'N') || (transpose ==
't') || (transpose ==
'T') ), std::invalid_argument,
1345 ">>> ERROR (ArrayTools::matvecProductDataData): The transpose flag must be 'n', 'N', 't' or 'T'.");
1350 TEUCHOS_TEST_FOR_EXCEPTION( !( (dataLeftRank == 2) || (dataLeftRank == 3) || (dataLeftRank == 4) ), std::invalid_argument,
1351 ">>> ERROR (ArrayTools::matvecProductDataData): inputDataLeft rank 2, 3 or 4 required.")
1358 else if(dataRightRank == 2) {
1359 if(numDataLeftPts != 1){
1361 switch(dataLeftRank){
1363 for(
size_t cell = 0; cell < numCells; cell++) {
1364 for(
size_t point = 0; point < numPoints; point++) {
1365 for(
size_t row = 0; row < matDim; row++) {
1366 outputDataWrap(cell, point, row) = \
1367 inputDataLeftWrap(cell, point)*inputDataRightWrap(point, row);
1374 for(
size_t cell = 0; cell < numCells; cell++) {
1375 for(
size_t point = 0; point < numPoints; point++) {
1376 for(
size_t row = 0; row < matDim; row++) {
1377 outputDataWrap(cell, point, row) = \
1378 inputDataLeftWrap(cell, point, row)*inputDataRightWrap(point, row);
1385 if ((transpose ==
'n') || (transpose ==
'N')) {
1386 for(
size_t cell = 0; cell < numCells; cell++){
1387 for(
size_t point = 0; point < numPoints; point++){
1388 for(
size_t row = 0; row < matDim; row++){
1389 outputDataWrap(cell, point, row) = 0.0;
1390 for(
size_t col = 0; col < matDim; col++){
1391 outputDataWrap(cell, point, row) += \
1392 inputDataLeftWrap(cell, point, row, col)*inputDataRightWrap(point, col);
1398 else if ((transpose ==
't') || (transpose ==
'T')) {
1399 for(
size_t cell = 0; cell < numCells; cell++){
1400 for(
size_t point = 0; point < numPoints; point++){
1401 for(
size_t row = 0; row < matDim; row++){
1402 outputDataWrap(cell, point, row) = 0.0;
1403 for(
size_t col = 0; col < matDim; col++){
1404 outputDataWrap(cell, point, row) += \
1405 inputDataLeftWrap(cell, point, col, row)*inputDataRightWrap(point, col);
1412 TEUCHOS_TEST_FOR_EXCEPTION( !( (transpose ==
'n') || (transpose ==
'N') || (transpose ==
't') || (transpose ==
'T') ), std::invalid_argument,
1413 ">>> ERROR (ArrayTools::matvecProductDataData): The transpose flag must be 'n', 'N', 't' or 'T'.");
1418 TEUCHOS_TEST_FOR_EXCEPTION( !( (dataLeftRank == 2) || (dataLeftRank == 3) || (dataLeftRank == 4) ), std::invalid_argument,
1419 ">>> ERROR (ArrayTools::matvecProductDataData): inputDataLeft rank 2, 3 or 4 required.")
1423 switch(dataLeftRank){
1425 for(
size_t cell = 0; cell < numCells; cell++) {
1426 for(
size_t point = 0; point < numPoints; point++) {
1427 for(
size_t row = 0; row < matDim; row++) {
1428 outputDataWrap(cell, point, row) = \
1429 inputDataLeftWrap(cell, 0)*inputDataRightWrap(point, row);
1436 for(
size_t cell = 0; cell < numCells; cell++) {
1437 for(
size_t point = 0; point < numPoints; point++) {
1438 for(
size_t row = 0; row < matDim; row++) {
1439 outputDataWrap(cell, point, row) = \
1440 inputDataLeftWrap(cell, 0, row)*inputDataRightWrap(point, row);
1447 if ((transpose ==
'n') || (transpose ==
'N')) {
1448 for(
size_t cell = 0; cell < numCells; cell++){
1449 for(
size_t point = 0; point < numPoints; point++){
1450 for(
size_t row = 0; row < matDim; row++){
1451 outputDataWrap(cell, point, row) = 0.0;
1452 for(
size_t col = 0; col < matDim; col++){
1453 outputDataWrap(cell, point, row) += \
1454 inputDataLeftWrap(cell, 0, row, col)*inputDataRightWrap(point, col);
1460 else if ((transpose ==
't') || (transpose ==
'T')) {
1461 for(
size_t cell = 0; cell < numCells; cell++){
1462 for(
size_t point = 0; point < numPoints; point++){
1463 for(
size_t row = 0; row < matDim; row++){
1464 outputDataWrap(cell, point, row) = 0.0;
1465 for(
size_t col = 0; col < matDim; col++){
1466 outputDataWrap(cell, point, row) += \
1467 inputDataLeftWrap(cell, 0, col, row)*inputDataRightWrap(point, col);
1474 TEUCHOS_TEST_FOR_EXCEPTION( !( (transpose ==
'n') || (transpose ==
'N') || (transpose ==
't') || (transpose ==
'T') ), std::invalid_argument,
1475 ">>> ERROR (ArrayTools::matvecProductDataData): The transpose flag must be 'n', 'N', 't' or 'T'.");
1480 TEUCHOS_TEST_FOR_EXCEPTION( !( (dataLeftRank == 2) || (dataLeftRank == 3) || (dataLeftRank == 4) ), std::invalid_argument,
1481 ">>> ERROR (ArrayTools::matvecProductDataData): inputDataLeft rank 2, 3 or 4 required.")
1486 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::invalid_argument,
1487 ">>> ERROR (ArrayTools::matvecProductDataData): inputDataRight rank 2 or 3 required.")
1493 template<
class Scalar,
1494 class ArrayOutFields,
1496 class ArrayInFields>
1498 const ArrayInData & inputData,
1499 const ArrayInFields & inputFields,
1500 const char transpose){
1501 #ifdef HAVE_INTREPID_DEBUG
1502 std::string errmsg =
">>> ERROR (ArrayTools::matmatProductDataField):";
1510 TEUCHOS_TEST_FOR_EXCEPTION( !requireRankRange(errmsg, inputData, 2,4),
1511 std::invalid_argument, errmsg);
1512 if(getrank(inputData) > 2) {
1513 TEUCHOS_TEST_FOR_EXCEPTION( !requireDimensionRange(errmsg, inputData, 2, 1,3),
1514 std::invalid_argument, errmsg);
1516 if(getrank(inputData) == 4) {
1517 TEUCHOS_TEST_FOR_EXCEPTION( !requireDimensionRange(errmsg, inputData, 3, 1,3),
1518 std::invalid_argument, errmsg);
1521 TEUCHOS_TEST_FOR_EXCEPTION( !requireRankRange(errmsg, inputFields, 4,5), std::invalid_argument, errmsg);
1522 TEUCHOS_TEST_FOR_EXCEPTION( !requireDimensionRange(errmsg, inputFields, getrank(inputFields)-1, 1,3),
1523 std::invalid_argument, errmsg);
1524 TEUCHOS_TEST_FOR_EXCEPTION( !requireDimensionRange(errmsg, inputFields, getrank(inputFields)-2, 1,3),
1525 std::invalid_argument, errmsg);
1527 TEUCHOS_TEST_FOR_EXCEPTION( !requireRankRange(errmsg, outputFields, 5,5), std::invalid_argument, errmsg);
1528 TEUCHOS_TEST_FOR_EXCEPTION( !requireDimensionRange(errmsg, outputFields, 3, 1,3),
1529 std::invalid_argument, errmsg);
1530 TEUCHOS_TEST_FOR_EXCEPTION( !requireDimensionRange(errmsg, outputFields, 4, 1,3),
1531 std::invalid_argument, errmsg);
1543 if(inputData.dimension(1) > 1){
1544 TEUCHOS_TEST_FOR_EXCEPTION( !requireDimensionMatch(errmsg,
1547 std::invalid_argument, errmsg);
1549 if(getrank(inputData) == 2) {
1550 TEUCHOS_TEST_FOR_EXCEPTION( !requireDimensionMatch(errmsg,
1553 std::invalid_argument, errmsg);
1555 if(getrank(inputData) == 3){
1556 TEUCHOS_TEST_FOR_EXCEPTION( !requireDimensionMatch(errmsg,
1557 outputFields, 0,3,4,
1559 std::invalid_argument, errmsg);
1562 if(getrank(inputData) == 4){
1563 TEUCHOS_TEST_FOR_EXCEPTION( !requireDimensionMatch(errmsg,
1564 outputFields, 0,3,4,
1566 std::invalid_argument, errmsg);
1571 if( getrank(inputFields) == 5) {
1573 if(inputData.dimension(1) > 1){
1574 TEUCHOS_TEST_FOR_EXCEPTION( !requireDimensionMatch(errmsg,
1577 std::invalid_argument, errmsg);
1579 if(getrank(inputData) == 2){
1580 TEUCHOS_TEST_FOR_EXCEPTION( !requireDimensionMatch(errmsg,
1583 std::invalid_argument, errmsg);
1585 if(getrank(inputData) == 3){
1586 TEUCHOS_TEST_FOR_EXCEPTION( !requireDimensionMatch(errmsg,
1588 inputFields, 0,3,4),
1589 std::invalid_argument, errmsg);
1591 if(getrank(inputData) == 4){
1592 TEUCHOS_TEST_FOR_EXCEPTION( !requireDimensionMatch(errmsg,
1594 inputFields, 0,3,4),
1595 std::invalid_argument, errmsg);
1598 TEUCHOS_TEST_FOR_EXCEPTION( !requireDimensionMatch(errmsg, outputFields, inputFields),
1599 std::invalid_argument, errmsg);
1603 if(inputData.dimension(1) > 1){
1604 TEUCHOS_TEST_FOR_EXCEPTION( !requireDimensionMatch(errmsg,
1607 std::invalid_argument, errmsg);
1609 if(getrank(inputData) == 3){
1610 TEUCHOS_TEST_FOR_EXCEPTION( !requireDimensionMatch(errmsg,
1613 std::invalid_argument, errmsg);
1615 if(getrank(inputData) == 4){
1616 TEUCHOS_TEST_FOR_EXCEPTION( !requireDimensionMatch(errmsg,
1619 std::invalid_argument, errmsg);
1622 TEUCHOS_TEST_FOR_EXCEPTION( !requireDimensionMatch(errmsg,
1623 outputFields, 1,2,3,4,
1624 inputFields, 0,1,2,3),
1625 std::invalid_argument, errmsg);
1628 ArrayWrapper<Scalar,ArrayOutFields, Rank<ArrayOutFields >::value,
false>outputFieldsWrap(outputFields);
1629 ArrayWrapper<Scalar,ArrayInData, Rank<ArrayInData >::value,
true>inputDataWrap(inputData);
1630 ArrayWrapper<Scalar,ArrayInFields, Rank<ArrayInFields >::value,
true>inputFieldsWrap(inputFields);
1633 size_t dataRank = getrank(inputData);
1634 size_t numDataPts = inputData.dimension(1);
1635 size_t inRank = getrank(inputFields);
1636 size_t numCells = outputFields.dimension(0);
1637 size_t numFields = outputFields.dimension(1);
1638 size_t numPoints = outputFields.dimension(2);
1639 size_t matDim = outputFields.dimension(3);
1645 if(numDataPts != 1){
1649 for(
size_t cell = 0; cell < numCells; cell++) {
1650 for(
size_t field = 0; field < numFields; field++) {
1651 for(
size_t point = 0; point < numPoints; point++) {
1652 for(
size_t row = 0; row < matDim; row++) {
1653 for(
size_t col = 0; col < matDim; col++) {
1654 outputFieldsWrap(cell, field, point, row, col) = \
1655 inputDataWrap(cell, point)*inputFieldsWrap(cell, field, point, row, col);
1664 for(
size_t cell = 0; cell < numCells; cell++) {
1665 for(
size_t field = 0; field < numFields; field++) {
1666 for(
size_t point = 0; point < numPoints; point++) {
1667 for(
size_t row = 0; row < matDim; row++) {
1668 for(
size_t col = 0; col < matDim; col++) {
1669 outputFieldsWrap(cell, field, point, row, col) = \
1670 inputDataWrap(cell, point, row)*inputFieldsWrap(cell, field, point, row, col);
1679 if ((transpose ==
'n') || (transpose ==
'N')) {
1680 for(
size_t cell = 0; cell < numCells; cell++){
1681 for(
size_t field = 0; field < numFields; field++){
1682 for(
size_t point = 0; point < numPoints; point++){
1683 for(
size_t row = 0; row < matDim; row++){
1684 for(
size_t col = 0; col < matDim; col++){
1685 outputFieldsWrap(cell, field, point, row, col) = 0.0;
1686 for(
size_t i = 0; i < matDim; i++){
1687 outputFieldsWrap(cell, field, point, row, col) += \
1688 inputDataWrap(cell, point, row, i)*inputFieldsWrap(cell, field, point, i, col);
1696 else if ((transpose ==
't') || (transpose ==
'T')) {
1697 for(
size_t cell = 0; cell < numCells; cell++){
1698 for(
size_t field = 0; field < numFields; field++){
1699 for(
size_t point = 0; point < numPoints; point++){
1700 for(
size_t row = 0; row < matDim; row++){
1701 for(
size_t col = 0; col < matDim; col++){
1702 outputFieldsWrap(cell, field, point, row, col) = 0.0;
1703 for(
size_t i = 0; i < matDim; i++){
1704 outputFieldsWrap(cell, field, point, row, col) += \
1705 inputDataWrap(cell, point, i, row)*inputFieldsWrap(cell, field, point, i, col);
1714 TEUCHOS_TEST_FOR_EXCEPTION( !( (transpose ==
'n') || (transpose ==
'N') || (transpose ==
't') || (transpose ==
'T') ), std::invalid_argument,
1715 ">>> ERROR (ArrayTools::matmatProductDataField): The transpose flag must be 'n', 'N', 't' or 'T'.");
1720 TEUCHOS_TEST_FOR_EXCEPTION( !( (dataRank == 2) || (dataRank == 3) || (dataRank == 4) ), std::invalid_argument,
1721 ">>> ERROR (ArrayTools::matmatProductDataField): inputData rank 2, 3 or 4 required.")
1727 for(
size_t cell = 0; cell < numCells; cell++) {
1728 for(
size_t field = 0; field < numFields; field++) {
1729 for(
size_t point = 0; point < numPoints; point++) {
1730 for(
size_t row = 0; row < matDim; row++) {
1731 for(
size_t col = 0; col < matDim; col++) {
1732 outputFieldsWrap(cell, field, point, row, col) = \
1733 inputDataWrap(cell, 0)*inputFieldsWrap(cell, field, point, row, col);
1742 for(
size_t cell = 0; cell < numCells; cell++) {
1743 for(
size_t field = 0; field < numFields; field++) {
1744 for(
size_t point = 0; point < numPoints; point++) {
1745 for(
size_t row = 0; row < matDim; row++) {
1746 for(
size_t col = 0; col < matDim; col++) {
1747 outputFieldsWrap(cell, field, point, row, col) = \
1748 inputDataWrap(cell, 0, row)*inputFieldsWrap(cell, field, point, row, col);
1757 if ((transpose ==
'n') || (transpose ==
'N')) {
1758 for(
size_t cell = 0; cell < numCells; cell++){
1759 for(
size_t field = 0; field < numFields; field++){
1760 for(
size_t point = 0; point < numPoints; point++){
1761 for(
size_t row = 0; row < matDim; row++){
1762 for(
size_t col = 0; col < matDim; col++){
1763 outputFieldsWrap(cell, field, point, row, col) = 0.0;
1764 for(
size_t i = 0; i < matDim; i++){
1765 outputFieldsWrap(cell, field, point, row, col) += \
1766 inputDataWrap(cell, 0, row, i)*inputFieldsWrap(cell, field, point, i, col);
1774 else if ((transpose ==
't') || (transpose ==
'T')) {
1775 for(
size_t cell = 0; cell < numCells; cell++){
1776 for(
size_t field = 0; field < numFields; field++){
1777 for(
size_t point = 0; point < numPoints; point++){
1778 for(
size_t row = 0; row < matDim; row++){
1779 for(
size_t col = 0; col < matDim; col++){
1780 outputFieldsWrap(cell, field, point, row, col) = 0.0;
1781 for(
size_t i = 0; i < matDim; i++){
1782 outputFieldsWrap(cell, field, point, row, col) += \
1783 inputDataWrap(cell, 0, i, row)*inputFieldsWrap(cell, field, point, i, col);
1792 TEUCHOS_TEST_FOR_EXCEPTION( !( (transpose ==
'n') || (transpose ==
'N') || (transpose ==
't') || (transpose ==
'T') ), std::invalid_argument,
1793 ">>> ERROR (ArrayTools::matmatProductDataField): The transpose flag must be 'n', 'N', 't' or 'T'.");
1798 TEUCHOS_TEST_FOR_EXCEPTION( !( (dataRank == 2) || (dataRank == 3) || (dataRank == 4) ), std::invalid_argument,
1799 ">>> ERROR (ArrayTools::matmatProductDataField): inputData rank 2, 3 or 4 required.")
1806 else if(inRank == 4) {
1807 if(numDataPts != 1){
1811 for(
size_t cell = 0; cell < numCells; cell++) {
1812 for(
size_t field = 0; field < numFields; field++) {
1813 for(
size_t point = 0; point < numPoints; point++) {
1814 for(
size_t row = 0; row < matDim; row++) {
1815 for(
size_t col = 0; col < matDim; col++) {
1816 outputFieldsWrap(cell, field, point, row, col) = \
1817 inputDataWrap(cell, point)*inputFieldsWrap(field, point, row, col);
1826 for(
size_t cell = 0; cell < numCells; cell++) {
1827 for(
size_t field = 0; field < numFields; field++) {
1828 for(
size_t point = 0; point < numPoints; point++) {
1829 for(
size_t row = 0; row < matDim; row++) {
1830 for(
size_t col = 0; col < matDim; col++) {
1831 outputFieldsWrap(cell, field, point, row, col) = \
1832 inputDataWrap(cell, point, row)*inputFieldsWrap(field, point, row, col);
1841 if ((transpose ==
'n') || (transpose ==
'N')) {
1842 for(
size_t cell = 0; cell < numCells; cell++){
1843 for(
size_t field = 0; field < numFields; field++){
1844 for(
size_t point = 0; point < numPoints; point++){
1845 for(
size_t row = 0; row < matDim; row++){
1846 for(
size_t col = 0; col < matDim; col++){
1847 outputFieldsWrap(cell, field, point, row, col) = 0.0;
1848 for(
size_t i = 0; i < matDim; i++){
1849 outputFieldsWrap(cell, field, point, row, col) += \
1850 inputDataWrap(cell, point, row, i)*inputFieldsWrap(field, point, i, col);
1858 else if ((transpose ==
't') || (transpose ==
'T')) {
1859 for(
size_t cell = 0; cell < numCells; cell++){
1860 for(
size_t field = 0; field < numFields; field++){
1861 for(
size_t point = 0; point < numPoints; point++){
1862 for(
size_t row = 0; row < matDim; row++){
1863 for(
size_t col = 0; col < matDim; col++){
1864 outputFieldsWrap(cell, field, point, row, col) = 0.0;
1865 for(
size_t i = 0; i < matDim; i++){
1866 outputFieldsWrap(cell, field, point, row, col) += \
1867 inputDataWrap(cell, point, i, row)*inputFieldsWrap(field, point, i, col);
1876 TEUCHOS_TEST_FOR_EXCEPTION( !( (transpose ==
'n') || (transpose ==
'N') || (transpose ==
't') || (transpose ==
'T') ), std::invalid_argument,
1877 ">>> ERROR (ArrayTools::matmatProductDataField): The transpose flag must be 'n', 'N', 't' or 'T'.");
1882 TEUCHOS_TEST_FOR_EXCEPTION( !( (dataRank == 2) || (dataRank == 3) || (dataRank == 4) ), std::invalid_argument,
1883 ">>> ERROR (ArrayTools::matmatProductDataField): inputData rank 2, 3 or 4 required.")
1889 for(
size_t cell = 0; cell < numCells; cell++) {
1890 for(
size_t field = 0; field < numFields; field++) {
1891 for(
size_t point = 0; point < numPoints; point++) {
1892 for(
size_t row = 0; row < matDim; row++) {
1893 for(
size_t col = 0; col < matDim; col++) {
1894 outputFieldsWrap(cell, field, point, row, col) = \
1895 inputDataWrap(cell, 0)*inputFieldsWrap(field, point, row, col);
1904 for(
size_t cell = 0; cell < numCells; cell++) {
1905 for(
size_t field = 0; field < numFields; field++) {
1906 for(
size_t point = 0; point < numPoints; point++) {
1907 for(
size_t row = 0; row < matDim; row++) {
1908 for(
size_t col = 0; col < matDim; col++) {
1909 outputFieldsWrap(cell, field, point, row, col) = \
1910 inputDataWrap(cell, 0, row)*inputFieldsWrap(field, point, row, col);
1919 if ((transpose ==
'n') || (transpose ==
'N')) {
1920 for(
size_t cell = 0; cell < numCells; cell++){
1921 for(
size_t field = 0; field < numFields; field++){
1922 for(
size_t point = 0; point < numPoints; point++){
1923 for(
size_t row = 0; row < matDim; row++){
1924 for(
size_t col = 0; col < matDim; col++){
1925 outputFieldsWrap(cell, field, point, row, col) = 0.0;
1926 for(
size_t i = 0; i < matDim; i++){
1927 outputFieldsWrap(cell, field, point, row, col) += \
1928 inputDataWrap(cell, 0, row, i)*inputFieldsWrap(field, point, i, col);
1936 else if ((transpose ==
't') || (transpose ==
'T')) {
1937 for(
size_t cell = 0; cell < numCells; cell++){
1938 for(
size_t field = 0; field < numFields; field++){
1939 for(
size_t point = 0; point < numPoints; point++){
1940 for(
size_t row = 0; row < matDim; row++){
1941 for(
size_t col = 0; col < matDim; col++){
1942 outputFieldsWrap(cell, field, point, row, col) = 0.0;
1943 for(
size_t i = 0; i < matDim; i++){
1944 outputFieldsWrap(cell, field, point, row, col) += \
1945 inputDataWrap(cell, 0, i, row)*inputFieldsWrap(field, point, i, col);
1954 TEUCHOS_TEST_FOR_EXCEPTION( !( (transpose ==
'n') || (transpose ==
'N') || (transpose ==
't') || (transpose ==
'T') ), std::invalid_argument,
1955 ">>> ERROR (ArrayTools::matmatProductDataField): The transpose flag must be 'n', 'N', 't' or 'T'.");
1960 TEUCHOS_TEST_FOR_EXCEPTION( !( (dataRank == 2) || (dataRank == 3) || (dataRank == 4) ), std::invalid_argument,
1961 ">>> ERROR (ArrayTools::matmatProductDataField): inputData rank 2, 3 or 4 required.")
1966 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::invalid_argument,
1967 ">>> ERROR (ArrayTools::matmatProductDataField): inputFields rank 4 or 5 required.")
1972 template<
class Scalar,
1974 class ArrayInDataLeft,
1975 class ArrayInDataRight>
1977 const ArrayInDataLeft & inputDataLeft,
1978 const ArrayInDataRight & inputDataRight,
1979 const char transpose){
1981 #ifdef HAVE_INTREPID_DEBUG
1982 std::string errmsg =
">>> ERROR (ArrayTools::matmatProductDataData):";
1990 TEUCHOS_TEST_FOR_EXCEPTION( !requireRankRange(errmsg, inputDataLeft, 2,4),
1991 std::invalid_argument, errmsg);
1992 if(getrank(inputDataLeft) > 2) {
1993 TEUCHOS_TEST_FOR_EXCEPTION( !requireDimensionRange(errmsg, inputDataLeft, 2, 1,3),
1994 std::invalid_argument, errmsg);
1996 if(getrank(inputDataLeft) == 4) {
1997 TEUCHOS_TEST_FOR_EXCEPTION( !requireDimensionRange(errmsg, inputDataLeft, 3, 1,3),
1998 std::invalid_argument, errmsg);
2001 TEUCHOS_TEST_FOR_EXCEPTION( !requireRankRange(errmsg, inputDataRight, 3,4),
2002 std::invalid_argument, errmsg);
2003 TEUCHOS_TEST_FOR_EXCEPTION( !requireDimensionRange(errmsg, inputDataRight, getrank(inputDataRight)-1, 1,3),
2004 std::invalid_argument, errmsg);
2005 TEUCHOS_TEST_FOR_EXCEPTION( !requireDimensionRange(errmsg, inputDataRight, getrank(inputDataRight)-2, 1,3),
2006 std::invalid_argument, errmsg);
2008 TEUCHOS_TEST_FOR_EXCEPTION( !requireRankRange(errmsg, outputData, 4, 4), std::invalid_argument, errmsg);
2009 TEUCHOS_TEST_FOR_EXCEPTION( !requireDimensionRange(errmsg, outputData, 2, 1,3),
2010 std::invalid_argument, errmsg);
2011 TEUCHOS_TEST_FOR_EXCEPTION( !requireDimensionRange(errmsg, outputData, 3, 1,3),
2012 std::invalid_argument, errmsg);
2024 if(inputDataLeft.dimension(1) > 1){
2025 TEUCHOS_TEST_FOR_EXCEPTION( !requireDimensionMatch(errmsg,
2028 std::invalid_argument, errmsg);
2030 if(getrank(inputDataLeft) == 2){
2031 TEUCHOS_TEST_FOR_EXCEPTION( !requireDimensionMatch(errmsg,
2034 std::invalid_argument, errmsg);
2036 if(getrank(inputDataLeft) == 3){
2037 TEUCHOS_TEST_FOR_EXCEPTION( !requireDimensionMatch(errmsg,
2039 inputDataLeft, 0,2,2),
2040 std::invalid_argument, errmsg);
2042 if(getrank(inputDataLeft) == 4){
2043 TEUCHOS_TEST_FOR_EXCEPTION( !requireDimensionMatch(errmsg,
2045 inputDataLeft, 0,2,3),
2046 std::invalid_argument, errmsg);
2051 if( getrank(inputDataRight) == 4) {
2053 if(inputDataLeft.dimension(1) > 1){
2054 TEUCHOS_TEST_FOR_EXCEPTION( !requireDimensionMatch(errmsg,
2057 std::invalid_argument, errmsg);
2059 if(getrank(inputDataLeft) == 2){
2060 TEUCHOS_TEST_FOR_EXCEPTION( !requireDimensionMatch(errmsg,
2063 std::invalid_argument, errmsg);
2065 if(getrank(inputDataLeft) == 3){
2066 TEUCHOS_TEST_FOR_EXCEPTION( !requireDimensionMatch(errmsg,
2067 inputDataLeft, 0,2,2,
2068 inputDataRight, 0,2,3),
2069 std::invalid_argument, errmsg);
2071 if(getrank(inputDataLeft) == 4){
2072 TEUCHOS_TEST_FOR_EXCEPTION( !requireDimensionMatch(errmsg,
2073 inputDataLeft, 0,2,3,
2074 inputDataRight, 0,2,3),
2075 std::invalid_argument, errmsg);
2078 TEUCHOS_TEST_FOR_EXCEPTION( !requireDimensionMatch(errmsg, outputData, inputDataRight),
2079 std::invalid_argument, errmsg);
2083 if(inputDataLeft.dimension(1) > 1){
2084 TEUCHOS_TEST_FOR_EXCEPTION( !requireDimensionMatch(errmsg,
2087 std::invalid_argument, errmsg);
2089 if(getrank(inputDataLeft) == 3){
2090 TEUCHOS_TEST_FOR_EXCEPTION( !requireDimensionMatch(errmsg,
2092 inputDataRight, 1,2),
2093 std::invalid_argument, errmsg);
2095 if(getrank(inputDataLeft) == 4){
2096 TEUCHOS_TEST_FOR_EXCEPTION( !requireDimensionMatch(errmsg,
2098 inputDataRight, 1,2),
2099 std::invalid_argument, errmsg);
2102 TEUCHOS_TEST_FOR_EXCEPTION( !requireDimensionMatch(errmsg,
2104 inputDataRight, 0,1,2),
2105 std::invalid_argument, errmsg);
2110 ArrayWrapper<Scalar,ArrayOutData, Rank<ArrayOutData >::value,
false>outputDataWrap(outputData);
2111 ArrayWrapper<Scalar,ArrayInDataLeft, Rank<ArrayInDataLeft >::value,
true>inputDataLeftWrap(inputDataLeft);
2112 ArrayWrapper<Scalar,ArrayInDataRight, Rank<ArrayInDataRight >::value,
true>inputDataRightWrap(inputDataRight);
2114 size_t dataLeftRank = getrank(inputDataLeft);
2115 size_t numDataLeftPts = inputDataLeft.dimension(1);
2116 size_t dataRightRank = getrank(inputDataRight);
2117 size_t numCells = outputData.dimension(0);
2118 size_t numPoints = outputData.dimension(1);
2119 size_t matDim = outputData.dimension(2);
2124 if(dataRightRank == 4){
2125 if(numDataLeftPts != 1){
2127 switch(dataLeftRank){
2129 for(
size_t cell = 0; cell < numCells; cell++) {
2130 for(
size_t point = 0; point < numPoints; point++) {
2131 for(
size_t row = 0; row < matDim; row++) {
2132 for(
size_t col = 0; col < matDim; col++) {
2133 outputDataWrap(cell, point, row, col) = \
2134 inputDataLeftWrap(cell, point)*inputDataRightWrap(cell, point, row, col);
2142 for(
size_t cell = 0; cell < numCells; cell++) {
2143 for(
size_t point = 0; point < numPoints; point++) {
2144 for(
size_t row = 0; row < matDim; row++) {
2145 for(
size_t col = 0; col < matDim; col++) {
2146 outputDataWrap(cell, point, row, col) = \
2147 inputDataLeftWrap(cell, point, row)*inputDataRightWrap(cell, point, row, col);
2155 if ((transpose ==
'n') || (transpose ==
'N')) {
2156 for(
size_t cell = 0; cell < numCells; cell++){
2157 for(
size_t point = 0; point < numPoints; point++){
2158 for(
size_t row = 0; row < matDim; row++){
2159 for(
size_t col = 0; col < matDim; col++){
2160 outputDataWrap(cell, point, row, col) = 0.0;
2161 for(
size_t i = 0; i < matDim; i++){
2162 outputDataWrap(cell, point, row, col) += \
2163 inputDataLeftWrap(cell, point, row, i)*inputDataRightWrap(cell, point, i, col);
2170 else if ((transpose ==
't') || (transpose ==
'T')) {
2171 for(
size_t cell = 0; cell < numCells; cell++){
2172 for(
size_t point = 0; point < numPoints; point++){
2173 for(
size_t row = 0; row < matDim; row++){
2174 for(
size_t col = 0; col < matDim; col++){
2175 outputDataWrap(cell, point, row, col) = 0.0;
2176 for(
size_t i = 0; i < matDim; i++){
2177 outputDataWrap(cell, point, row, col) += \
2178 inputDataLeftWrap(cell, point, i, row)*inputDataRightWrap(cell, point, i, col);
2186 TEUCHOS_TEST_FOR_EXCEPTION( !( (transpose ==
'n') || (transpose ==
'N') || (transpose ==
't') || (transpose ==
'T') ), std::invalid_argument,
2187 ">>> ERROR (ArrayTools::matmatProductDataData): The transpose flag must be 'n', 'N', 't' or 'T'.");
2192 TEUCHOS_TEST_FOR_EXCEPTION( !( (dataLeftRank == 2) || (dataLeftRank == 3) || (dataLeftRank == 4) ), std::invalid_argument,
2193 ">>> ERROR (ArrayTools::matmatProductDataData): inputDataLeft rank 2, 3 or 4 required.")
2197 switch(dataLeftRank){
2199 for(
size_t cell = 0; cell < numCells; cell++) {
2200 for(
size_t point = 0; point < numPoints; point++) {
2201 for(
size_t row = 0; row < matDim; row++) {
2202 for(
size_t col = 0; col < matDim; col++) {
2203 outputDataWrap(cell, point, row, col) = \
2204 inputDataLeftWrap(cell, 0)*inputDataRightWrap(cell, point, row, col);
2212 for(
size_t cell = 0; cell < numCells; cell++) {
2213 for(
size_t point = 0; point < numPoints; point++) {
2214 for(
size_t row = 0; row < matDim; row++) {
2215 for(
size_t col = 0; col < matDim; col++) {
2216 outputDataWrap(cell, point, row, col) = \
2217 inputDataLeftWrap(cell, 0, row)*inputDataRightWrap(cell, point, row, col);
2225 if ((transpose ==
'n') || (transpose ==
'N')) {
2226 for(
size_t cell = 0; cell < numCells; cell++){
2227 for(
size_t point = 0; point < numPoints; point++){
2228 for(
size_t row = 0; row < matDim; row++){
2229 for(
size_t col = 0; col < matDim; col++){
2230 outputDataWrap(cell, point, row, col) = 0.0;
2231 for(
size_t i = 0; i < matDim; i++){
2232 outputDataWrap(cell, point, row, col) += \
2233 inputDataLeftWrap(cell, 0, row, i)*inputDataRightWrap(cell, point, i, col);
2240 else if ((transpose ==
't') || (transpose ==
'T')) {
2241 for(
size_t cell = 0; cell < numCells; cell++){
2242 for(
size_t point = 0; point < numPoints; point++){
2243 for(
size_t row = 0; row < matDim; row++){
2244 for(
size_t col = 0; col < matDim; col++){
2245 outputDataWrap(cell, point, row, col) = 0.0;
2246 for(
size_t i = 0; i < matDim; i++){
2247 outputDataWrap(cell, point, row, col) += \
2248 inputDataLeftWrap(cell, 0, i, row)*inputDataRightWrap(cell, point, i, col);
2256 TEUCHOS_TEST_FOR_EXCEPTION( !( (transpose ==
'n') || (transpose ==
'N') || (transpose ==
't') || (transpose ==
'T') ), std::invalid_argument,
2257 ">>> ERROR (ArrayTools::matmatProductDataData): The transpose flag must be 'n', 'N', 't' or 'T'.");
2262 TEUCHOS_TEST_FOR_EXCEPTION( !( (dataLeftRank == 2) || (dataLeftRank == 3) || (dataLeftRank == 4) ), std::invalid_argument,
2263 ">>> ERROR (ArrayTools::matmatProductDataData): inputDataLeft rank 2, 3 or 4 required.")
2270 else if(dataRightRank == 3) {
2271 if(numDataLeftPts != 1){
2273 switch(dataLeftRank){
2275 for(
size_t cell = 0; cell < numCells; cell++) {
2276 for(
size_t point = 0; point < numPoints; point++) {
2277 for(
size_t row = 0; row < matDim; row++) {
2278 for(
size_t col = 0; col < matDim; col++) {
2279 outputDataWrap(cell, point, row, col) = \
2280 inputDataLeftWrap(cell, point)*inputDataRightWrap(point, row, col);
2288 for(
size_t cell = 0; cell < numCells; cell++) {
2289 for(
size_t point = 0; point < numPoints; point++) {
2290 for(
size_t row = 0; row < matDim; row++) {
2291 for(
size_t col = 0; col < matDim; col++) {
2292 outputDataWrap(cell, point, row, col) = \
2293 inputDataLeftWrap(cell, point, row)*inputDataRightWrap(point, row, col);
2301 if ((transpose ==
'n') || (transpose ==
'N')) {
2302 for(
size_t cell = 0; cell < numCells; cell++){
2303 for(
size_t point = 0; point < numPoints; point++){
2304 for(
size_t row = 0; row < matDim; row++){
2305 for(
size_t col = 0; col < matDim; col++){
2306 outputDataWrap(cell, point, row, col) = 0.0;
2307 for(
size_t i = 0; i < matDim; i++){
2308 outputDataWrap(cell, point, row, col) += \
2309 inputDataLeftWrap(cell, point, row, i)*inputDataRightWrap(point, i, col);
2316 else if ((transpose ==
't') || (transpose ==
'T')) {
2317 for(
size_t cell = 0; cell < numCells; cell++){
2318 for(
size_t point = 0; point < numPoints; point++){
2319 for(
size_t row = 0; row < matDim; row++){
2320 for(
size_t col = 0; col < matDim; col++){
2321 outputDataWrap(cell, point, row, col) = 0.0;
2322 for(
size_t i = 0; i < matDim; i++){
2323 outputDataWrap(cell, point, row, col) += \
2324 inputDataLeftWrap(cell, point, i, row)*inputDataRightWrap(point, i, col);
2332 TEUCHOS_TEST_FOR_EXCEPTION( !( (transpose ==
'n') || (transpose ==
'N') || (transpose ==
't') || (transpose ==
'T') ), std::invalid_argument,
2333 ">>> ERROR (ArrayTools::matmatProductDataData): The transpose flag must be 'n', 'N', 't' or 'T'.");
2338 TEUCHOS_TEST_FOR_EXCEPTION( !( (dataLeftRank == 2) || (dataLeftRank == 3) || (dataLeftRank == 4) ), std::invalid_argument,
2339 ">>> ERROR (ArrayTools::matmatProductDataData): inputDataLeft rank 2, 3 or 4 required.")
2343 switch(dataLeftRank){
2345 for(
size_t cell = 0; cell < numCells; cell++) {
2346 for(
size_t point = 0; point < numPoints; point++) {
2347 for(
size_t row = 0; row < matDim; row++) {
2348 for(
size_t col = 0; col < matDim; col++) {
2349 outputDataWrap(cell, point, row, col) = \
2350 inputDataLeftWrap(cell, 0)*inputDataRightWrap(point, row, col);
2358 for(
size_t cell = 0; cell < numCells; cell++) {
2359 for(
size_t point = 0; point < numPoints; point++) {
2360 for(
size_t row = 0; row < matDim; row++) {
2361 for(
size_t col = 0; col < matDim; col++) {
2362 outputDataWrap(cell, point, row, col) = \
2363 inputDataLeftWrap(cell, 0, row)*inputDataRightWrap(point, row, col);
2371 if ((transpose ==
'n') || (transpose ==
'N')) {
2372 for(
size_t cell = 0; cell < numCells; cell++){
2373 for(
size_t point = 0; point < numPoints; point++){
2374 for(
size_t row = 0; row < matDim; row++){
2375 for(
size_t col = 0; col < matDim; col++){
2376 outputDataWrap(cell, point, row, col) = 0.0;
2377 for(
size_t i = 0; i < matDim; i++){
2378 outputDataWrap(cell, point, row, col) += \
2379 inputDataLeftWrap(cell, 0, row, i)*inputDataRightWrap(point, i, col);
2386 else if ((transpose ==
't') || (transpose ==
'T')) {
2387 for(
size_t cell = 0; cell < numCells; cell++){
2388 for(
size_t point = 0; point < numPoints; point++){
2389 for(
size_t row = 0; row < matDim; row++){
2390 for(
size_t col = 0; col < matDim; col++){
2391 outputDataWrap(cell, point, row, col) = 0.0;
2392 for(
size_t i = 0; i < matDim; i++){
2393 outputDataWrap(cell, point, row, col) += \
2394 inputDataLeftWrap(cell, 0, i, row)*inputDataRightWrap(point, i, col);
2402 TEUCHOS_TEST_FOR_EXCEPTION( !( (transpose ==
'n') || (transpose ==
'N') || (transpose ==
't') || (transpose ==
'T') ), std::invalid_argument,
2403 ">>> ERROR (ArrayTools::matmatProductDataData): The transpose flag must be 'n', 'N', 't' or 'T'.");
2408 TEUCHOS_TEST_FOR_EXCEPTION( !( (dataLeftRank == 2) || (dataLeftRank == 3) || (dataLeftRank == 4) ), std::invalid_argument,
2409 ">>> ERROR (ArrayTools::matmatProductDataData): inputDataLeft rank 2, 3 or 4 required.")
2414 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::invalid_argument,
2415 ">>> ERROR (ArrayTools::matmatProductDataData): inputDataRight rank 3 or 4 required.")