50 template<
class Scalar, 
class ArrayOutFields, 
class ArrayInFieldsLeft, 
class ArrayInFieldsRight>
 
   52                                           const ArrayInFieldsLeft &   leftFields,
 
   53                                           const ArrayInFieldsRight &  rightFields,
 
   54                                           const ECompEngine           compEngine,                                          
 
   58 #ifdef HAVE_INTREPID_DEBUG 
   59   TEUCHOS_TEST_FOR_EXCEPTION( (getrank(leftFields)  != 3 ), std::invalid_argument,
 
   60                               ">>> ERROR (ArrayTools::contractFieldFieldScalar): Rank of the left input argument must equal 3!");
 
   61   TEUCHOS_TEST_FOR_EXCEPTION( (getrank(rightFields) != 3 ), std::invalid_argument,
 
   62                               ">>> ERROR (ArrayTools::contractFieldFieldScalar): Rank of right input argument must equal 3!");
 
   63   TEUCHOS_TEST_FOR_EXCEPTION( (getrank(outputFields) != 3 ), std::invalid_argument,
 
   64                               ">>> ERROR (ArrayTools::contractFieldFieldScalar): Rank of output argument must equal 3!");
 
   65   TEUCHOS_TEST_FOR_EXCEPTION( (leftFields.dimension(0) != rightFields.dimension(0) ), std::invalid_argument,
 
   66                               ">>> ERROR (ArrayTools::contractFieldFieldScalar): Zeroth dimensions (number of integration domains) of the left and right input containers must agree!");
 
   67   TEUCHOS_TEST_FOR_EXCEPTION( (leftFields.dimension(2) != rightFields.dimension(2) ), std::invalid_argument,
 
   68                               ">>> ERROR (ArrayTools::contractFieldFieldScalar): Second dimensions (numbers of integration points) of the left and right input containers must agree!");
 
   69   TEUCHOS_TEST_FOR_EXCEPTION( (outputFields.dimension(0) != rightFields.dimension(0) ), std::invalid_argument,
 
   70                               ">>> ERROR (ArrayTools::contractFieldFieldScalar): Zeroth dimensions (numbers of integration domains) of the input and output containers must agree!");
 
   71   TEUCHOS_TEST_FOR_EXCEPTION( (outputFields.dimension(1) != leftFields.dimension(1) ), std::invalid_argument,
 
   72                               ">>> ERROR (ArrayTools::contractFieldFieldScalar): First dimension of output container and first dimension of left input container must agree!");
 
   73   TEUCHOS_TEST_FOR_EXCEPTION( (outputFields.dimension(2) != rightFields.dimension(1) ), std::invalid_argument,
 
   74                               ">>> ERROR (ArrayTools::contractFieldFieldScalar): Second dimension of output container and first dimension of right input container must agree!");
 
   76   TEUCHOS_TEST_FOR_EXCEPTION( ( compEngine!=COMP_CPP && compEngine!=COMP_BLAS  ), std::invalid_argument,
 
   77                               ">>> ERROR (ArrayTools::contractFieldFieldScalar): Computational engine not defined!");
 
   81   int numCells        = leftFields.dimension(0);
 
   82   int numLeftFields   = leftFields.dimension(1);
 
   83   int numRightFields  = rightFields.dimension(1);
 
   84   int numPoints       = leftFields.dimension(2);
 
   88         for (
int cl = 0; cl < numCells; cl++) {
 
   89           for (
int lbf = 0; lbf < numLeftFields; lbf++) {
 
   90             for (
int rbf = 0; rbf < numRightFields; rbf++) {
 
   92               for (
int qp = 0; qp < numPoints; qp++) {
 
   93                 tmpVal += leftFields(cl, lbf, qp)*rightFields(cl, rbf, qp);
 
   95               outputFields(cl, lbf, rbf) += tmpVal;
 
  101         for (
int cl = 0; cl < numCells; cl++) {
 
  102           for (
int lbf = 0; lbf < numLeftFields; lbf++) {
 
  103             for (
int rbf = 0; rbf < numRightFields; rbf++) {
 
  105               for (
int qp = 0; qp < numPoints; qp++) {
 
  106                 tmpVal += leftFields(cl, lbf, qp)*rightFields(cl, rbf, qp);
 
  108               outputFields(cl, lbf, rbf) = tmpVal;
 
  116 template<
class Scalar, 
class ArrayOutFields, 
class ArrayInFieldsLeft, 
class ArrayInFieldsRight>
 
  118                                           const ArrayInFieldsLeft &   leftFields,
 
  119                                           const ArrayInFieldsRight &  rightFields,
 
  120                                           const ECompEngine           compEngine,
 
  121                                           const bool                  sumInto) {
 
  123 #ifdef HAVE_INTREPID_DEBUG 
  124   TEUCHOS_TEST_FOR_EXCEPTION( (getrank(leftFields)  != 4 ), std::invalid_argument,
 
  125                               ">>> ERROR (ArrayTools::contractFieldFieldVector): Rank of the left input argument must equal 4!");
 
  126   TEUCHOS_TEST_FOR_EXCEPTION( (getrank(rightFields) != 4 ), std::invalid_argument,
 
  127                               ">>> ERROR (ArrayTools::contractFieldFieldVector): Rank of right input argument must equal 4!");
 
  128   TEUCHOS_TEST_FOR_EXCEPTION( (getrank(outputFields) != 3 ), std::invalid_argument,
 
  129                               ">>> ERROR (ArrayTools::contractFieldFieldVector): Rank of output argument must equal 3!");
 
  130   TEUCHOS_TEST_FOR_EXCEPTION( (leftFields.dimension(0) != rightFields.dimension(0) ), std::invalid_argument,
 
  131                       ">>> ERROR (ArrayTools::contractFieldFieldVector): Zeroth dimensions (number of integration domains) of the left and right input containers must agree!");
 
  132   TEUCHOS_TEST_FOR_EXCEPTION( (leftFields.dimension(2) != rightFields.dimension(2) ), std::invalid_argument,
 
  133                       ">>> ERROR (ArrayTools::contractFieldFieldVector): Second dimensions (numbers of integration points) of the left and right input containers must agree!");
 
  134   TEUCHOS_TEST_FOR_EXCEPTION( (leftFields.dimension(3) != rightFields.dimension(3) ), std::invalid_argument,
 
  135                       ">>> ERROR (ArrayTools::contractFieldFieldVector): Third dimensions (numbers of vector components) of the left and right input containers must agree!");
 
  136   TEUCHOS_TEST_FOR_EXCEPTION( (outputFields.dimension(0) != rightFields.dimension(0) ), std::invalid_argument,
 
  137                       ">>> ERROR (ArrayTools::contractFieldFieldVector): Zeroth dimensions (numbers of integration domains) of the input and output containers must agree!");
 
  138   TEUCHOS_TEST_FOR_EXCEPTION( (outputFields.dimension(1) != leftFields.dimension(1) ), std::invalid_argument,
 
  139                       ">>> ERROR (ArrayTools::contractFieldFieldVector): First dimension of output container and first dimension of left input container must agree!");
 
  140   TEUCHOS_TEST_FOR_EXCEPTION( (outputFields.dimension(2) != rightFields.dimension(1) ), std::invalid_argument,
 
  141                       ">>> ERROR (ArrayTools::contractFieldFieldVector): Second dimension of output container and first dimension of right input container must agree!");
 
  142   TEUCHOS_TEST_FOR_EXCEPTION( ( compEngine!=COMP_CPP && compEngine!=COMP_BLAS  ), std::invalid_argument,
 
  143                               ">>> ERROR (ArrayTools::contractFieldFieldScalar): Computational engine not defined!");
 
  148   int numCells        = leftFields.dimension(0);
 
  149   int numLeftFields   = leftFields.dimension(1);
 
  150   int numRightFields  = rightFields.dimension(1);
 
  151   int numPoints       = leftFields.dimension(2);
 
  152   int dimVec          = leftFields.dimension(3);
 
  156         for (
int cl = 0; cl < numCells; cl++) {
 
  157           for (
int lbf = 0; lbf < numLeftFields; lbf++) {
 
  158             for (
int rbf = 0; rbf < numRightFields; rbf++) {
 
  160               for (
int qp = 0; qp < numPoints; qp++) {
 
  161                 for (
int iVec = 0; iVec < dimVec; iVec++) {
 
  162                   tmpVal += leftFields(cl, lbf, qp, iVec)*rightFields(cl, rbf, qp, iVec);
 
  165               outputFields(cl, lbf, rbf) += tmpVal;
 
  171         for (
int cl = 0; cl < numCells; cl++) {
 
  172           for (
int lbf = 0; lbf < numLeftFields; lbf++) {
 
  173             for (
int rbf = 0; rbf < numRightFields; rbf++) {
 
  175               for (
int qp = 0; qp < numPoints; qp++) {
 
  176                 for (
int iVec = 0; iVec < dimVec; iVec++) {
 
  177                   tmpVal += leftFields(cl, lbf, qp, iVec)*rightFields(cl, rbf, qp, iVec);
 
  180               outputFields(cl, lbf, rbf) = tmpVal;
 
  188 template<
class Scalar, 
class ArrayOutFields, 
class ArrayInFieldsLeft, 
class ArrayInFieldsRight>
 
  190                                           const ArrayInFieldsLeft &   leftFields,
 
  191                                           const ArrayInFieldsRight &  rightFields,
 
  192                                           const ECompEngine           compEngine,
 
  193                                           const bool                  sumInto) {
 
  195 #ifdef HAVE_INTREPID_DEBUG 
  196   TEUCHOS_TEST_FOR_EXCEPTION( (getrank(leftFields)  != 5 ), std::invalid_argument,
 
  197                               ">>> ERROR (ArrayTools::contractFieldFieldTensor): Rank of the left input argument must equal 5!");
 
  198   TEUCHOS_TEST_FOR_EXCEPTION( (getrank(rightFields) != 5 ), std::invalid_argument,
 
  199                               ">>> ERROR (ArrayTools::contractFieldFieldTensor): Rank of right input argument must equal 5!");
 
  200   TEUCHOS_TEST_FOR_EXCEPTION( (getrank(outputFields) != 3 ), std::invalid_argument,
 
  201                               ">>> ERROR (ArrayTools::contractFieldFieldTensor): Rank of output argument must equal 3!");
 
  202   TEUCHOS_TEST_FOR_EXCEPTION( (leftFields.dimension(0) != rightFields.dimension(0) ), std::invalid_argument,
 
  203                       ">>> ERROR (ArrayTools::contractFieldFieldTensor): Zeroth dimensions (number of integration domains) of the left and right input containers must agree!");
 
  204   TEUCHOS_TEST_FOR_EXCEPTION( (leftFields.dimension(2) != rightFields.dimension(2) ), std::invalid_argument,
 
  205                       ">>> ERROR (ArrayTools::contractFieldFieldTensor): Second dimensions (numbers of integration points) of the left and right input containers must agree!");
 
  206   TEUCHOS_TEST_FOR_EXCEPTION( (leftFields.dimension(3) != rightFields.dimension(3) ), std::invalid_argument,
 
  207                       ">>> ERROR (ArrayTools::contractFieldFieldTensor): Third dimensions (first tensor dimensions) of the left and right input containers must agree!");
 
  208   TEUCHOS_TEST_FOR_EXCEPTION( (leftFields.dimension(4) != rightFields.dimension(4) ), std::invalid_argument,
 
  209                       ">>> ERROR (ArrayTools::contractFieldFieldTensor): Fourth dimensions (second tensor dimensions) of the left and right input containers must agree!");
 
  210   TEUCHOS_TEST_FOR_EXCEPTION( (outputFields.dimension(0) != rightFields.dimension(0) ), std::invalid_argument,
 
  211                       ">>> ERROR (ArrayTools::contractFieldFieldTensor): Zeroth dimensions (numbers of integration domains) of the input and output containers must agree!");
 
  212   TEUCHOS_TEST_FOR_EXCEPTION( (outputFields.dimension(1) != leftFields.dimension(1) ), std::invalid_argument,
 
  213                       ">>> ERROR (ArrayTools::contractFieldFieldTensor): First dimension of output container and first dimension of left input container must agree!");
 
  214   TEUCHOS_TEST_FOR_EXCEPTION( (outputFields.dimension(2) != rightFields.dimension(1) ), std::invalid_argument,
 
  215                       ">>> ERROR (ArrayTools::contractFieldFieldTensor): Second dimension of output container and first dimension of right input container must agree!");
 
  216   TEUCHOS_TEST_FOR_EXCEPTION( ( compEngine!=COMP_CPP && compEngine!=COMP_BLAS  ), std::invalid_argument,
 
  217                               ">>> ERROR (ArrayTools::contractFieldFieldScalar): Computational engine not defined!");
 
  222   int numCells        = leftFields.dimension(0);
 
  223   int numLeftFields   = leftFields.dimension(1);
 
  224   int numRightFields  = rightFields.dimension(1);
 
  225   int numPoints       = leftFields.dimension(2);
 
  226   int dim1Tensor      = leftFields.dimension(3);
 
  227   int dim2Tensor      = leftFields.dimension(4);
 
  230         for (
int cl = 0; cl < numCells; cl++) {
 
  231           for (
int lbf = 0; lbf < numLeftFields; lbf++) {
 
  232             for (
int rbf = 0; rbf < numRightFields; rbf++) {
 
  234               for (
int qp = 0; qp < numPoints; qp++) {
 
  235                 for (
int iTens1 = 0; iTens1 < dim1Tensor; iTens1++) {
 
  236                   for (
int iTens2 = 0; iTens2 < dim2Tensor; iTens2++) {
 
  237                     tmpVal += leftFields(cl, lbf, qp, iTens1, iTens2)*rightFields(cl, rbf, qp, iTens1, iTens2);
 
  241               outputFields(cl, lbf, rbf) += tmpVal;
 
  247         for (
int cl = 0; cl < numCells; cl++) {
 
  248           for (
int lbf = 0; lbf < numLeftFields; lbf++) {
 
  249             for (
int rbf = 0; rbf < numRightFields; rbf++) {
 
  251               for (
int qp = 0; qp < numPoints; qp++) {
 
  252                 for (
int iTens1 = 0; iTens1 < dim1Tensor; iTens1++) {
 
  253                   for (
int iTens2 = 0; iTens2 < dim2Tensor; iTens2++) {
 
  254                     tmpVal += leftFields(cl, lbf, qp, iTens1, iTens2)*rightFields(cl, rbf, qp, iTens1, iTens2);
 
  258               outputFields(cl, lbf, rbf) = tmpVal;
 
  266 template<
class Scalar, 
class ArrayOutFields, 
class ArrayInData, 
class ArrayInFields>
 
  268                                          const ArrayInData &    inputData,
 
  269                                          const ArrayInFields &  inputFields,
 
  270                                          const ECompEngine           compEngine,
 
  271                                          const bool             sumInto) {
 
  274 #ifdef HAVE_INTREPID_DEBUG 
  275   TEUCHOS_TEST_FOR_EXCEPTION( (getrank(inputFields)  != 3 ), std::invalid_argument,
 
  276                               ">>> ERROR (ArrayTools::contractDataFieldScalar): Rank of the fields input argument must equal 3!");
 
  277   TEUCHOS_TEST_FOR_EXCEPTION( (getrank(inputData) != 2 ), std::invalid_argument,
 
  278                               ">>> ERROR (ArrayTools::contractDataFieldScalar): Rank of the data input argument must equal 2!");
 
  279   TEUCHOS_TEST_FOR_EXCEPTION( (getrank(outputFields) != 2 ), std::invalid_argument,
 
  280                               ">>> ERROR (ArrayTools::contractDataFieldScalar): Rank of output argument must equal 2!");
 
  281   TEUCHOS_TEST_FOR_EXCEPTION( (inputFields.dimension(0) != inputData.dimension(0) ), std::invalid_argument,
 
  282                       ">>> ERROR (ArrayTools::contractDataFieldScalar): Zeroth dimensions (number of integration domains) of the fields and data input containers must agree!");
 
  283   TEUCHOS_TEST_FOR_EXCEPTION( ( (inputFields.dimension(2) != inputData.dimension(1)) && (inputData.dimension(1) != 1) ), std::invalid_argument,
 
  284                       ">>> ERROR (ArrayTools::contractDataFieldScalar): Second dimension of fields input container and first dimension of data input container (number of integration points) must agree or first data dimension must be 1!");
 
  285   TEUCHOS_TEST_FOR_EXCEPTION( (outputFields.dimension(0) != inputFields.dimension(0) ), std::invalid_argument,
 
  286                       ">>> ERROR (ArrayTools::contractDataFieldScalar): Zeroth dimensions (numbers of integration domains) of the fields input and output containers must agree!");
 
  287   TEUCHOS_TEST_FOR_EXCEPTION( (outputFields.dimension(1) != inputFields.dimension(1) ), std::invalid_argument,
 
  288                       ">>> ERROR (ArrayTools::contractDataFieldScalar): First dimensions (number of fields) of the fields input and output containers must agree!");
 
  289   TEUCHOS_TEST_FOR_EXCEPTION( ( compEngine!=COMP_CPP && compEngine!=COMP_BLAS  ), std::invalid_argument,
 
  290                               ">>> ERROR (ArrayTools::contractFieldFieldScalar): Computational engine not defined!");
 
  295   int numCells       = inputFields.dimension(0);
 
  296   int numFields      = inputFields.dimension(1);
 
  297   int numPoints      = inputFields.dimension(2);
 
  298   int numDataPoints  = inputData.dimension(1);
 
  302         if (numDataPoints != 1) { 
 
  303           for (
int cl = 0; cl < numCells; cl++) {
 
  304             for (
int lbf = 0; lbf < numFields; lbf++) {
 
  306               for (
int qp = 0; qp < numPoints; qp++) {
 
  307                 tmpVal += inputFields(cl, lbf, qp)*inputData(cl, qp);
 
  309               outputFields(cl, lbf) += tmpVal;
 
  314           for (
int cl = 0; cl < numCells; cl++) {
 
  315             for (
int lbf = 0; lbf < numFields; lbf++) {
 
  317               for (
int qp = 0; qp < numPoints; qp++) {
 
  318                 tmpVal += inputFields(cl, lbf, qp)*inputData(cl, 0);
 
  320               outputFields(cl, lbf) += tmpVal;
 
  326         if (numDataPoints != 1) { 
 
  327           for (
int cl = 0; cl < numCells; cl++) {
 
  328             for (
int lbf = 0; lbf < numFields; lbf++) {
 
  330               for (
int qp = 0; qp < numPoints; qp++) {
 
  331                 tmpVal += inputFields(cl, lbf, qp)*inputData(cl, qp);
 
  333               outputFields(cl, lbf) = tmpVal;
 
  338           for (
int cl = 0; cl < numCells; cl++) {
 
  339             for (
int lbf = 0; lbf < numFields; lbf++) {
 
  341               for (
int qp = 0; qp < numPoints; qp++) {
 
  342                 tmpVal += inputFields(cl, lbf, qp)*inputData(cl, 0);
 
  344               outputFields(cl, lbf) = tmpVal;
 
  353 template<
class Scalar, 
class ArrayOutFields, 
class ArrayInData, 
class ArrayInFields>
 
  355                                          const ArrayInData &    inputData,
 
  356                                          const ArrayInFields &  inputFields,
 
  357                                          const ECompEngine      compEngine,
 
  358                                          const bool             sumInto) {
 
  360 #ifdef HAVE_INTREPID_DEBUG 
  361   TEUCHOS_TEST_FOR_EXCEPTION( (getrank(inputFields)  != 4 ), std::invalid_argument,
 
  362                               ">>> ERROR (ArrayTools::contractDataFieldVector): Rank of the fields input argument must equal 4!");
 
  363   TEUCHOS_TEST_FOR_EXCEPTION( (getrank(inputData) != 3 ), std::invalid_argument,
 
  364                               ">>> ERROR (ArrayTools::contractDataFieldVector): Rank of the data input argument must equal 3!");
 
  365   TEUCHOS_TEST_FOR_EXCEPTION( (getrank(outputFields) != 2 ), std::invalid_argument,
 
  366                               ">>> ERROR (ArrayTools::contractDataFieldVector): Rank of output argument must equal 2!");
 
  367   TEUCHOS_TEST_FOR_EXCEPTION( (inputFields.dimension(0) != inputData.dimension(0) ), std::invalid_argument,
 
  368                       ">>> ERROR (ArrayTools::contractDataFieldVector): Zeroth dimensions (number of integration domains) of the fields and data input containers must agree!");
 
  369   TEUCHOS_TEST_FOR_EXCEPTION( ( (inputFields.dimension(2) != inputData.dimension(1)) && (inputData.dimension(1) != 1) ), std::invalid_argument,
 
  370                       ">>> ERROR (ArrayTools::contractDataFieldVector): Second dimension of the fields input container and first dimension of data input container (number of integration points) must agree or first data dimension must be 1!");
 
  371   TEUCHOS_TEST_FOR_EXCEPTION( (inputFields.dimension(3) != inputData.dimension(2) ), std::invalid_argument,
 
  372                       ">>> ERROR (ArrayTools::contractDataFieldVector): Third dimension of the fields input container and second dimension of data input container (vector index) must agree!");
 
  373   TEUCHOS_TEST_FOR_EXCEPTION( (outputFields.dimension(0) != inputFields.dimension(0) ), std::invalid_argument,
 
  374                       ">>> ERROR (ArrayTools::contractDataFieldVector): Zeroth dimensions (numbers of integration domains) of the fields input and output containers must agree!");
 
  375   TEUCHOS_TEST_FOR_EXCEPTION( (outputFields.dimension(1) != inputFields.dimension(1) ), std::invalid_argument,
 
  376                       ">>> ERROR (ArrayTools::contractDataFieldVector): First dimensions of output container and fields input container (number of fields) must agree!");
 
  377   TEUCHOS_TEST_FOR_EXCEPTION( ( compEngine!=COMP_CPP && compEngine!=COMP_BLAS  ), std::invalid_argument,
 
  378                               ">>> ERROR (ArrayTools::contractFieldFieldScalar): Computational engine not defined!");
 
  384   int numCells       = inputFields.dimension(0);
 
  385   int numFields      = inputFields.dimension(1);
 
  386   int numPoints      = inputFields.dimension(2);
 
  387   int dimVec         = inputFields.dimension(3);
 
  388   int numDataPoints  = inputData.dimension(1);
 
  391         if (numDataPoints != 1) { 
 
  392           for (
int cl = 0; cl < numCells; cl++) {
 
  393               for (
int lbf = 0; lbf < numFields; lbf++) {
 
  395                 for (
int qp = 0; qp < numPoints; qp++) {
 
  396                   for (
int iVec = 0; iVec < dimVec; iVec++) {
 
  397                     tmpVal += inputFields(cl, lbf, qp, iVec)*inputData(cl, qp, iVec);
 
  400                 outputFields(cl, lbf) += tmpVal;
 
  405           for (
int cl = 0; cl < numCells; cl++) {
 
  406               for (
int lbf = 0; lbf < numFields; lbf++) {
 
  408                 for (
int qp = 0; qp < numPoints; qp++) {
 
  409                   for (
int iVec = 0; iVec < dimVec; iVec++) {
 
  410                     tmpVal += inputFields(cl, lbf, qp, iVec)*inputData(cl, 0, iVec);
 
  413                 outputFields(cl, lbf) += tmpVal;
 
  419         if (numDataPoints != 1) { 
 
  420           for (
int cl = 0; cl < numCells; cl++) {
 
  421               for (
int lbf = 0; lbf < numFields; lbf++) {
 
  423                 for (
int qp = 0; qp < numPoints; qp++) {
 
  424                   for (
int iVec = 0; iVec < dimVec; iVec++) {
 
  425                     tmpVal += inputFields(cl, lbf, qp, iVec)*inputData(cl, qp, iVec);
 
  428                 outputFields(cl, lbf) = tmpVal;
 
  433           for (
int cl = 0; cl < numCells; cl++) {
 
  434               for (
int lbf = 0; lbf < numFields; lbf++) {
 
  436                 for (
int qp = 0; qp < numPoints; qp++) {
 
  437                   for (
int iVec = 0; iVec < dimVec; iVec++) {
 
  438                     tmpVal += inputFields(cl, lbf, qp, iVec)*inputData(cl, 0, iVec);
 
  441                 outputFields(cl, lbf) = tmpVal;
 
  449 template<
class Scalar, 
class ArrayOutFields, 
class ArrayInData, 
class ArrayInFields>
 
  451                                          const ArrayInData &    inputData,
 
  452                                          const ArrayInFields &  inputFields,
 
  453                                          const ECompEngine           compEngine,
 
  454                                          const bool             sumInto) {
 
  456 #ifdef HAVE_INTREPID_DEBUG 
  457   TEUCHOS_TEST_FOR_EXCEPTION( (getrank(inputFields)  != 5 ), std::invalid_argument,
 
  458                               ">>> ERROR (ArrayTools::contractDataFieldTensor): Rank of the fields input argument must equal 5!");
 
  459   TEUCHOS_TEST_FOR_EXCEPTION( (getrank(inputData) != 4 ), std::invalid_argument,
 
  460                               ">>> ERROR (ArrayTools::contractDataFieldTensor): Rank of the data input argument must equal 4!");
 
  461   TEUCHOS_TEST_FOR_EXCEPTION( (getrank(outputFields) != 2 ), std::invalid_argument,
 
  462                               ">>> ERROR (ArrayTools::contractDataFieldTensor): Rank of output argument must equal 2!");
 
  463   TEUCHOS_TEST_FOR_EXCEPTION( (inputFields.dimension(0) != inputData.dimension(0) ), std::invalid_argument,
 
  464                       ">>> ERROR (ArrayTools::contractDataFieldTensor): Zeroth dimensions (number of integration domains) of the fields and data input containers must agree!");
 
  465   TEUCHOS_TEST_FOR_EXCEPTION( ( (inputFields.dimension(2) != inputData.dimension(1)) && (inputData.dimension(1) != 1) ), std::invalid_argument,
 
  466                       ">>> ERROR (ArrayTools::contractDataFieldTensor): Second dimension of the fields input container and first dimension of data input container (number of integration points) must agree or first data dimension must be 1!");
 
  467   TEUCHOS_TEST_FOR_EXCEPTION( (inputFields.dimension(3) != inputData.dimension(2) ), std::invalid_argument,
 
  468                       ">>> ERROR (ArrayTools::contractDataFieldTensor): Third dimension of the fields input container and second dimension of data input container (first tensor dimension) must agree!");
 
  469   TEUCHOS_TEST_FOR_EXCEPTION( (inputFields.dimension(4) != inputData.dimension(3) ), std::invalid_argument,
 
  470                       ">>> ERROR (ArrayTools::contractDataFieldTensor): Fourth dimension of the fields input container and third dimension of data input container (second tensor dimension) must agree!");
 
  471   TEUCHOS_TEST_FOR_EXCEPTION( (outputFields.dimension(0) != inputFields.dimension(0) ), std::invalid_argument,
 
  472                       ">>> ERROR (ArrayTools::contractDataFieldTensor): Zeroth dimensions (numbers of integration domains) of the fields input and output containers must agree!");
 
  473   TEUCHOS_TEST_FOR_EXCEPTION( (outputFields.dimension(1) != inputFields.dimension(1) ), std::invalid_argument,
 
  474                       ">>> ERROR (ArrayTools::contractDataFieldTensor): First dimensions (number of fields) of output container and fields input container must agree!");
 
  475   TEUCHOS_TEST_FOR_EXCEPTION( ( compEngine!=COMP_CPP && compEngine!=COMP_BLAS  ), std::invalid_argument,
 
  476                               ">>> ERROR (ArrayTools::contractFieldFieldScalar): Computational engine not defined!");
 
  481   int numCells       = inputFields.dimension(0);
 
  482   int numFields      = inputFields.dimension(1);
 
  483   int numPoints      = inputFields.dimension(2);
 
  484   int dim1Tens       = inputFields.dimension(3);
 
  485   int dim2Tens       = inputFields.dimension(4);
 
  486   int numDataPoints  = inputData.dimension(1);
 
  490         if (numDataPoints != 1) { 
 
  491           for (
int cl = 0; cl < numCells; cl++) {
 
  492               for (
int lbf = 0; lbf < numFields; lbf++) {
 
  494                 for (
int qp = 0; qp < numPoints; qp++) {
 
  495                   for (
int iTens1 = 0; iTens1 < dim1Tens; iTens1++) {
 
  496                     for (
int iTens2 =0; iTens2 < dim2Tens; iTens2++) {
 
  497                       tmpVal += inputFields(cl, lbf, qp, iTens1, iTens2)*inputData(cl, qp, iTens1, iTens2);
 
  501                 outputFields(cl, lbf) += tmpVal;
 
  506           for (
int cl = 0; cl < numCells; cl++) {
 
  507               for (
int lbf = 0; lbf < numFields; lbf++) {
 
  509                 for (
int qp = 0; qp < numPoints; qp++) {
 
  510                   for (
int iTens1 = 0; iTens1 < dim1Tens; iTens1++) {
 
  511                     for (
int iTens2 = 0; iTens2 < dim2Tens; iTens2++) {
 
  512                       tmpVal += inputFields(cl, lbf, qp, iTens1, iTens2)*inputData(cl, 0, iTens1, iTens2);
 
  516                 outputFields(cl, lbf) += tmpVal;
 
  522         if (numDataPoints != 1) { 
 
  523           for (
int cl = 0; cl < numCells; cl++) {
 
  524               for (
int lbf = 0; lbf < numFields; lbf++) {
 
  526                 for (
int qp = 0; qp < numPoints; qp++) {
 
  527                   for (
int iTens1 = 0; iTens1 < dim1Tens; iTens1++) {
 
  528                     for (
int iTens2 =0; iTens2 < dim2Tens; iTens2++) {
 
  529                       tmpVal += inputFields(cl, lbf, qp, iTens1, iTens2)*inputData(cl, qp, iTens1, iTens2);
 
  533                 outputFields(cl, lbf) = tmpVal;
 
  538           for (
int cl = 0; cl < numCells; cl++) {
 
  539               for (
int lbf = 0; lbf < numFields; lbf++) {
 
  541                 for (
int qp = 0; qp < numPoints; qp++) {
 
  542                   for (
int iTens1 = 0; iTens1 < dim1Tens; iTens1++) {
 
  543                     for (
int iTens2 = 0; iTens2 < dim2Tens; iTens2++) {
 
  544                       tmpVal += inputFields(cl, lbf, qp, iTens1, iTens2)*inputData(cl, 0, iTens1, iTens2);
 
  548                 outputFields(cl, lbf) = tmpVal;
 
  556 template<
class Scalar, 
class ArrayOutData, 
class ArrayInDataLeft, 
class ArrayInDataRight>
 
  558                                         const ArrayInDataLeft &   inputDataLeft,
 
  559                                         const ArrayInDataRight &  inputDataRight,
 
  560                                         const ECompEngine           compEngine,
 
  561                                         const bool                sumInto) {
 
  562 #ifdef HAVE_INTREPID_DEBUG 
  563   TEUCHOS_TEST_FOR_EXCEPTION( (getrank(inputDataLeft)  != 2 ), std::invalid_argument,
 
  564                               ">>> ERROR (ArrayTools::contractDataDataScalar): Rank of the left input argument must equal 2!");
 
  565   TEUCHOS_TEST_FOR_EXCEPTION( (getrank(inputDataRight) != 2 ), std::invalid_argument,
 
  566                               ">>> ERROR (ArrayTools::contractDataDataScalar): Rank of right input argument must equal 2!");
 
  567   TEUCHOS_TEST_FOR_EXCEPTION( (getrank(outputData) != 1 ), std::invalid_argument,
 
  568                               ">>> ERROR (ArrayTools::contractDataDataScalar): Rank of output argument must equal 1!");
 
  569   TEUCHOS_TEST_FOR_EXCEPTION( (inputDataLeft.dimension(0) != inputDataRight.dimension(0) ), std::invalid_argument,
 
  570                               ">>> ERROR (ArrayTools::contractDataDataScalar): Zeroth dimensions (number of integration domains) of the left and right input containers must agree!");
 
  571   TEUCHOS_TEST_FOR_EXCEPTION( (inputDataLeft.dimension(1) != inputDataRight.dimension(1) ), std::invalid_argument,
 
  572                               ">>> ERROR (ArrayTools::contractDataDataScalar): First dimensions (numbers of integration points) of the left and right input containers must agree!");
 
  573   TEUCHOS_TEST_FOR_EXCEPTION( (outputData.dimension(0) != inputDataRight.dimension(0) ), std::invalid_argument,
 
  574                               ">>> ERROR (ArrayTools::contractDataDataScalar): Zeroth dimensions (numbers of integration domains) of the input and output containers must agree!");
 
  575   TEUCHOS_TEST_FOR_EXCEPTION( ( compEngine!=COMP_CPP && compEngine!=COMP_BLAS  ), std::invalid_argument,
 
  576                               ">>> ERROR (ArrayTools::contractFieldFieldScalar): Computational engine not defined!");
 
  580   int numCells      = inputDataLeft.dimension(0);
 
  581   int numPoints     = inputDataLeft.dimension(1);
 
  584         for (
int cl = 0; cl < numCells; cl++) {
 
  586           for (
int qp = 0; qp < numPoints; qp++) {
 
  587             tmpVal += inputDataLeft(cl, qp)*inputDataRight(cl, qp);
 
  589           outputData(cl) += tmpVal;
 
  593         for (
int cl = 0; cl < numCells; cl++) {
 
  595           for (
int qp = 0; qp < numPoints; qp++) {
 
  596             tmpVal += inputDataLeft(cl, qp)*inputDataRight(cl, qp);
 
  598           outputData(cl) = tmpVal;
 
  606 template<
class Scalar, 
class ArrayOutData, 
class ArrayInDataLeft, 
class ArrayInDataRight>
 
  608                                         const ArrayInDataLeft &   inputDataLeft,
 
  609                                         const ArrayInDataRight &  inputDataRight,
 
  610                                         const ECompEngine           compEngine,
 
  611                                         const bool                sumInto) {
 
  613 #ifdef HAVE_INTREPID_DEBUG 
  614   TEUCHOS_TEST_FOR_EXCEPTION( (getrank(inputDataLeft)  != 3 ), std::invalid_argument,
 
  615                               ">>> ERROR (ArrayTools::contractDataDataVector): Rank of the left input argument must equal 3!");
 
  616   TEUCHOS_TEST_FOR_EXCEPTION( (getrank(inputDataRight) != 3 ), std::invalid_argument,
 
  617                               ">>> ERROR (ArrayTools::contractDataDataVector): Rank of right input argument must equal 3!");
 
  618   TEUCHOS_TEST_FOR_EXCEPTION( (getrank(outputData) != 1 ), std::invalid_argument,
 
  619                               ">>> ERROR (ArrayTools::contractDataDataVector): Rank of output argument must equal 1!");
 
  620   TEUCHOS_TEST_FOR_EXCEPTION( (inputDataLeft.dimension(0) != inputDataRight.dimension(0) ), std::invalid_argument,
 
  621                       ">>> ERROR (ArrayTools::contractDataDataVector): Zeroth dimensions (number of integration domains) of the left and right input containers must agree!");
 
  622   TEUCHOS_TEST_FOR_EXCEPTION( (inputDataLeft.dimension(1) != inputDataRight.dimension(1) ), std::invalid_argument,
 
  623                       ">>> ERROR (ArrayTools::contractDataDataVector): First dimensions (numbers of integration points) of the left and right input containers must agree!");
 
  624   TEUCHOS_TEST_FOR_EXCEPTION( (inputDataLeft.dimension(2) != inputDataRight.dimension(2) ), std::invalid_argument,
 
  625                       ">>> ERROR (ArrayTools::contractDataDataVector): Second dimensions (numbers of vector components) of the left and right input containers must agree!");
 
  626   TEUCHOS_TEST_FOR_EXCEPTION( (outputData.dimension(0) != inputDataRight.dimension(0) ), std::invalid_argument,
 
  627                       ">>> ERROR (ArrayTools::contractDataDataVector): Zeroth dimensions (numbers of integration domains) of the input and output containers must agree!");
 
  628   TEUCHOS_TEST_FOR_EXCEPTION( ( compEngine!=COMP_CPP && compEngine!=COMP_BLAS  ), std::invalid_argument,
 
  629                               ">>> ERROR (ArrayTools::contractFieldFieldScalar): Computational engine not defined!");
 
  634   int numCells        = inputDataLeft.dimension(0);
 
  635   int numPoints       = inputDataLeft.dimension(1);
 
  636   int dimVec          = inputDataLeft.dimension(2);
 
  640         for (
int cl = 0; cl < numCells; cl++) {
 
  642           for (
int qp = 0; qp < numPoints; qp++) {
 
  643             for (
int iVec = 0; iVec < dimVec; iVec++) {
 
  644               tmpVal += inputDataLeft(cl, qp, iVec)*inputDataRight(cl, qp, iVec);
 
  647           outputData(cl) += tmpVal;
 
  651         for (
int cl = 0; cl < numCells; cl++) {
 
  653           for (
int qp = 0; qp < numPoints; qp++) {
 
  654             for (
int iVec = 0; iVec < dimVec; iVec++) {
 
  655               tmpVal += inputDataLeft(cl, qp, iVec)*inputDataRight(cl, qp, iVec);
 
  658           outputData(cl) = tmpVal;
 
  664 template<
class Scalar, 
class ArrayOutData, 
class ArrayInDataLeft, 
class ArrayInDataRight>
 
  666                                         const ArrayInDataLeft &   inputDataLeft,
 
  667                                         const ArrayInDataRight &  inputDataRight,
 
  668                                         const ECompEngine           compEngine,
 
  669                                         const bool                sumInto) {
 
  671 #ifdef HAVE_INTREPID_DEBUG 
  672   TEUCHOS_TEST_FOR_EXCEPTION( (getrank(inputDataLeft)  != 4 ), std::invalid_argument,
 
  673                               ">>> ERROR (ArrayTools::contractDataDataTensor): Rank of the left input argument must equal 4");
 
  674   TEUCHOS_TEST_FOR_EXCEPTION( (getrank(inputDataRight) != 4 ), std::invalid_argument,
 
  675                               ">>> ERROR (ArrayTools::contractDataDataTensor): Rank of right input argument must equal 4!");
 
  676   TEUCHOS_TEST_FOR_EXCEPTION( (getrank(outputData) != 1 ), std::invalid_argument,
 
  677                               ">>> ERROR (ArrayTools::contractDataDataTensor): Rank of output argument must equal 1!");
 
  678   TEUCHOS_TEST_FOR_EXCEPTION( (inputDataLeft.dimension(0) != inputDataRight.dimension(0) ), std::invalid_argument,
 
  679                               ">>> ERROR (ArrayTools::contractDataDataTensor): Zeroth dimensions (number of integration domains) of the left and right input containers must agree!");
 
  680   TEUCHOS_TEST_FOR_EXCEPTION( (inputDataLeft.dimension(1) != inputDataRight.dimension(1) ), std::invalid_argument,
 
  681                               ">>> ERROR (ArrayTools::contractDataDataTensor): First dimensions (numbers of integration points) of the left and right input containers must agree!");
 
  682   TEUCHOS_TEST_FOR_EXCEPTION( (inputDataLeft.dimension(2) != inputDataRight.dimension(2) ), std::invalid_argument,
 
  683                               ">>> ERROR (ArrayTools::contractDataDataTensor): Second dimensions (first tensor dimensions) of the left and right input containers must agree!");
 
  684   TEUCHOS_TEST_FOR_EXCEPTION( (inputDataLeft.dimension(3) != inputDataRight.dimension(3) ), std::invalid_argument,
 
  685                               ">>> ERROR (ArrayTools::contractDataDataTensor): Third dimensions (second tensor dimensions) of the left and right input containers must agree!");
 
  686   TEUCHOS_TEST_FOR_EXCEPTION( (outputData.dimension(0) != inputDataRight.dimension(0) ), std::invalid_argument,
 
  687                               ">>> ERROR (ArrayTools::contractDataDataTensor): Zeroth dimensions (numbers of integration domains) of the input and output containers must agree!");
 
  688   TEUCHOS_TEST_FOR_EXCEPTION( ( compEngine!=COMP_CPP && compEngine!=COMP_BLAS  ), std::invalid_argument,
 
  689                               ">>> ERROR (ArrayTools::contractFieldFieldScalar): Computational engine not defined!");
 
  694   int numCells        = inputDataLeft.dimension(0);
 
  695   int numPoints       = inputDataLeft.dimension(1);
 
  696   int dim1Tensor      = inputDataLeft.dimension(2);
 
  697   int dim2Tensor      = inputDataLeft.dimension(3);
 
  701         for (
int cl = 0; cl < numCells; cl++) {
 
  703           for (
int qp = 0; qp < numPoints; qp++) {
 
  704             for (
int iTens1 = 0; iTens1 < dim1Tensor; iTens1++) {
 
  705               for (
int iTens2 = 0; iTens2 < dim2Tensor; iTens2++) {
 
  706                 tmpVal += inputDataLeft(cl, qp, iTens1, iTens2)*inputDataRight(cl, qp, iTens1, iTens2);
 
  710           outputData(cl) += tmpVal;
 
  714         for (
int cl = 0; cl < numCells; cl++) {
 
  716           for (
int qp = 0; qp < numPoints; qp++) {
 
  717             for (
int iTens1 = 0; iTens1 < dim1Tensor; iTens1++) {
 
  718               for (
int iTens2 = 0; iTens2 < dim2Tensor; iTens2++) {
 
  719                 tmpVal += inputDataLeft(cl, qp, iTens1, iTens2)*inputDataRight(cl, qp, iTens1, iTens2);
 
  723           outputData(cl) = tmpVal;