50         template<
class Scalar, 
class ArrayOutFields, 
class ArrayInFields>
 
   52                              const ArrayInFields &  inputFields) {
 
   54 #ifdef HAVE_INTREPID_DEBUG 
   55           TEUCHOS_TEST_FOR_EXCEPTION( ( (getrank(inputFields) < 2) || (getrank(inputFields) > 4) ), std::invalid_argument,
 
   56                                       ">>> ERROR (ArrayTools::cloneFields): Input fields container must have rank 2, 3, or 4.");
 
   57           TEUCHOS_TEST_FOR_EXCEPTION( (getrank(outputFields) != getrank(inputFields)+1), std::invalid_argument,
 
   58                                       ">>> ERROR (ArrayTools::cloneFields): The rank of the input fields container must be one less than the rank of the output fields container.");
 
   59           for (
size_t i=0; i<getrank(inputFields); i++) {
 
   60             std::string errmsg  = 
">>> ERROR (ArrayTools::cloneFields): Dimensions ";
 
   61             errmsg += (char)(48+i);
 
   63             errmsg += (char)(48+i+1);
 
   64             errmsg += 
" of the input and output fields containers must agree!";
 
   65             TEUCHOS_TEST_FOR_EXCEPTION( (inputFields.dimension(i) != outputFields.dimension(i+1)), std::invalid_argument, errmsg );
 
   68     ArrayWrapper<Scalar,ArrayOutFields, Rank<ArrayOutFields >::value,
false>outputFieldsWrap(outputFields);
 
   69     ArrayWrapper<Scalar,ArrayInFields, Rank<ArrayInFields >::value,
true>inputFieldswrap(inputFields);
 
   73   size_t invalRank      = getrank(inputFields);
 
   74   size_t outvalRank     = getrank(outputFields);
 
   75   int numCells       = outputFields.dimension(0);
 
   76   int numFields      = outputFields.dimension(1);
 
   77   int numPoints      = outputFields.dimension(2);
 
   81     dim1Tens = outputFields.dimension(3);
 
   83       dim2Tens = outputFields.dimension(4);
 
   89       for(
int cl = 0; cl < numCells; cl++) {
 
   90         for(
int bf = 0; bf < numFields; bf++) {
 
   91           for(
int pt = 0; pt < numPoints; pt++) {
 
   92             outputFieldsWrap(cl, bf, pt) = inputFieldswrap(bf, pt);
 
  100       for(
int cl = 0; cl < numCells; cl++) {
 
  101         for(
int bf = 0; bf < numFields; bf++) {
 
  102           for(
int pt = 0; pt < numPoints; pt++) {
 
  103             for( 
int iVec = 0; iVec < dim1Tens; iVec++) {
 
  104               outputFieldsWrap(cl, bf, pt, iVec) = inputFieldswrap(bf, pt, iVec);
 
  113       for(
int cl = 0; cl < numCells; cl++) {
 
  114         for(
int bf = 0; bf < numFields; bf++) {
 
  115           for(
int pt = 0; pt < numPoints; pt++) {
 
  116             for( 
int iTens1 = 0; iTens1 < dim1Tens; iTens1++) {
 
  117               for( 
int iTens2 = 0; iTens2 < dim2Tens; iTens2++) {
 
  118                 outputFieldsWrap(cl, bf, pt, iTens1, iTens2) = inputFieldswrap(bf, pt, iTens1, iTens2);
 
  128       TEUCHOS_TEST_FOR_EXCEPTION( !( (invalRank == 2) || (invalRank == 3) || (invalRank == 4) ), std::invalid_argument,
 
  129                           ">>> ERROR (ArrayTools::cloneFields): This method is defined only for rank-2, 3 or 4 input containers.");
 
  135 template<
class Scalar, 
class ArrayOutFields, 
class ArrayInFactors, 
class ArrayInFields>
 
  137                                   const ArrayInFactors &  inputFactors,
 
  138                                   const ArrayInFields &   inputFields) {
 
  140 #ifdef HAVE_INTREPID_DEBUG 
  141   TEUCHOS_TEST_FOR_EXCEPTION( (getrank(inputFactors) != 2), std::invalid_argument,
 
  142                       ">>> ERROR (ArrayTools::cloneScaleFields): The rank of the input factors container must be 2.");
 
  143   TEUCHOS_TEST_FOR_EXCEPTION( ( (getrank(inputFields) < 2) || (getrank(inputFields) > 4) ), std::invalid_argument,
 
  144                       ">>> ERROR (ArrayTools::cloneScaleFields): Input fields container must have rank 2, 3, or 4.");
 
  145   TEUCHOS_TEST_FOR_EXCEPTION( (getrank(outputFields) != getrank(inputFields)+1), std::invalid_argument,
 
  146                       ">>> ERROR (ArrayTools::cloneScaleFields): The rank of the input fields container must be one less than the rank of the output fields container.");
 
  147   TEUCHOS_TEST_FOR_EXCEPTION( ( inputFactors.dimension(0) != outputFields.dimension(0) ), std::invalid_argument,
 
  148                       ">>> ERROR (ArrayTools::cloneScaleFields): Zeroth dimensions of input factors container and output fields container (numbers of integration domains) must agree!");
 
  149   TEUCHOS_TEST_FOR_EXCEPTION( ( inputFactors.dimension(1) != outputFields.dimension(1) ), std::invalid_argument,
 
  150                       ">>> ERROR (ArrayTools::cloneScaleFields): First dimensions of input factors container and output fields container (numbers of fields) must agree!");
 
  151   for (
size_t i=0; i<getrank(inputFields); i++) {
 
  152     std::string errmsg  = 
">>> ERROR (ArrayTools::cloneScaleFields): Dimensions ";
 
  153     errmsg += (char)(48+i);
 
  155     errmsg += (char)(48+i+1);
 
  156     errmsg += 
" of the input and output fields containers must agree!";
 
  157     TEUCHOS_TEST_FOR_EXCEPTION( (inputFields.dimension(i) != outputFields.dimension(i+1)), std::invalid_argument, errmsg );
 
  160    ArrayWrapper<Scalar,ArrayOutFields, Rank<ArrayOutFields >::value,
false>outputFieldsWrap(outputFields);
 
  161    ArrayWrapper<Scalar,ArrayInFactors, Rank<ArrayInFactors >::value,
true>inputFactorswrap(inputFactors);
 
  162    ArrayWrapper<Scalar,ArrayInFields, Rank<ArrayInFields >::value,
true>inputFieldsWrap(inputFields);
 
  165   size_t invalRank      = getrank(inputFields);
 
  166   size_t outvalRank     = getrank(outputFields);
 
  167   int numCells       = outputFields.dimension(0);
 
  168   int numFields      = outputFields.dimension(1);
 
  169   int numPoints      = outputFields.dimension(2);
 
  172   if (outvalRank > 3) {
 
  173     dim1Tens = outputFields.dimension(3);
 
  174     if (outvalRank > 4) {
 
  175       dim2Tens = outputFields.dimension(4);
 
  181       for(
int cl = 0; cl < numCells; cl++) {
 
  182         for(
int bf = 0; bf < numFields; bf++) {
 
  183           for(
int pt = 0; pt < numPoints; pt++) {
 
  184             outputFieldsWrap(cl, bf, pt) = inputFieldsWrap(bf, pt) * inputFactorswrap(cl, bf);
 
  192       for(
int cl = 0; cl < numCells; cl++) {
 
  193         for(
int bf = 0; bf < numFields; bf++) {
 
  194           for(
int pt = 0; pt < numPoints; pt++) {
 
  195             for( 
int iVec = 0; iVec < dim1Tens; iVec++) {
 
  196               outputFieldsWrap(cl, bf, pt, iVec) = inputFieldsWrap(bf, pt, iVec) * inputFactorswrap(cl, bf);
 
  205       for(
int cl = 0; cl < numCells; cl++) {
 
  206         for(
int bf = 0; bf < numFields; bf++) {
 
  207           for(
int pt = 0; pt < numPoints; pt++) {
 
  208             for( 
int iTens1 = 0; iTens1 < dim1Tens; iTens1++) {
 
  209               for( 
int iTens2 = 0; iTens2 < dim2Tens; iTens2++) {
 
  210                 outputFieldsWrap(cl, bf, pt, iTens1, iTens2) = inputFieldsWrap(bf, pt, iTens1, iTens2) * inputFactorswrap(cl, bf);
 
  220       TEUCHOS_TEST_FOR_EXCEPTION( !( (invalRank == 2) || (invalRank == 3) || (invalRank == 4) ), std::invalid_argument,
 
  221                           ">>> ERROR (ArrayTools::cloneScaleFields): This method is defined only for rank-2, 3 or 4 input containers.");
 
  227 template<
class Scalar, 
class ArrayInOutFields, 
class ArrayInFactors>
 
  229                              const ArrayInFactors &  inputFactors) {
 
  231 #ifdef HAVE_INTREPID_DEBUG 
  232   TEUCHOS_TEST_FOR_EXCEPTION( (getrank(inputFactors) != 2), std::invalid_argument,
 
  233                       ">>> ERROR (ArrayTools::scaleFields): The rank of the input factors container must be 2.");
 
  234   TEUCHOS_TEST_FOR_EXCEPTION( ( (getrank(inoutFields) < 3) || (getrank(inoutFields) > 5) ), std::invalid_argument,
 
  235                       ">>> ERROR (ArrayTools::scaleFields): Input/output fields container must have rank 3, 4, or 5.");
 
  236   TEUCHOS_TEST_FOR_EXCEPTION( ( inputFactors.dimension(0) != inoutFields.dimension(0) ), std::invalid_argument,
 
  237                       ">>> ERROR (ArrayTools::scaleFields): Zeroth dimensions of input factors container and input/output fields container (numbers of integration domains) must agree!");
 
  238   TEUCHOS_TEST_FOR_EXCEPTION( ( inputFactors.dimension(1) != inoutFields.dimension(1) ), std::invalid_argument,
 
  239                       ">>> ERROR (ArrayTools::scaleFields): First dimensions (number of fields) of input factors and input/output fields containers must agree!");
 
  241    ArrayWrapper<Scalar,ArrayInOutFields, Rank<ArrayInOutFields >::value,
false>inoutFieldsWrap(inoutFields);
 
  242    ArrayWrapper<Scalar,ArrayInFactors, Rank<ArrayInFactors >::value,
true>inputFactorsWrap(inputFactors);
 
  244   size_t inoutRank      = getrank(inoutFields);
 
  245   int numCells       = inoutFields.dimension(0);
 
  246   int numFields      = inoutFields.dimension(1);
 
  247   int numPoints      = inoutFields.dimension(2);
 
  251     dim1Tens = inoutFields.dimension(3);
 
  253       dim2Tens = inoutFields.dimension(4);
 
  259       for(
int cl = 0; cl < numCells; cl++) {
 
  260         for(
int bf = 0; bf < numFields; bf++) {
 
  261           for(
int pt = 0; pt < numPoints; pt++) {
 
  262             inoutFieldsWrap(cl, bf, pt) = inoutFieldsWrap(cl, bf, pt) * inputFactorsWrap(cl, bf);
 
  270       for(
int cl = 0; cl < numCells; cl++) {
 
  271         for(
int bf = 0; bf < numFields; bf++) {
 
  272           for(
int pt = 0; pt < numPoints; pt++) {
 
  273             for( 
int iVec = 0; iVec < dim1Tens; iVec++) {
 
  274               inoutFieldsWrap(cl, bf, pt, iVec) = inoutFieldsWrap(cl, bf, pt, iVec) * inputFactorsWrap(cl, bf);
 
  283       for(
int cl = 0; cl < numCells; cl++) {
 
  284         for(
int bf = 0; bf < numFields; bf++) {
 
  285           for(
int pt = 0; pt < numPoints; pt++) {
 
  286             for( 
int iTens1 = 0; iTens1 < dim1Tens; iTens1++) {
 
  287               for( 
int iTens2 = 0; iTens2 < dim2Tens; iTens2++) {
 
  288                 inoutFieldsWrap(cl, bf, pt, iTens1, iTens2) = inoutFieldsWrap(cl, bf, pt, iTens1, iTens2) * inputFactorsWrap(cl, bf);
 
  298       TEUCHOS_TEST_FOR_EXCEPTION( !( (inoutRank == 3) || (inoutRank == 4) || (inoutRank == 5) ), std::invalid_argument,
 
  299                           ">>> ERROR (ArrayTools::cloneScaleFields): This method is defined only for rank-3, 4 or 5 input/output containers.");