00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00035 namespace Intrepid {
00036
00037 template<class Scalar, class ArrayOutFields, class ArrayInData, class ArrayInFields>
00038 void ArrayTools::scalarMultiplyDataField(ArrayOutFields & outputFields,
00039 const ArrayInData & inputData,
00040 ArrayInFields & inputFields,
00041 const bool reciprocal) {
00042
00043 #ifdef HAVE_INTREPID_DEBUG
00044 TEST_FOR_EXCEPTION( (inputData.rank() != 2), std::invalid_argument,
00045 ">>> ERROR (ArrayTools::scalarMultiplyDataField): Input data container must have rank 2.");
00046 if (outputFields.rank() <= inputFields.rank()) {
00047 TEST_FOR_EXCEPTION( ( (inputFields.rank() < 3) || (inputFields.rank() > 5) ), std::invalid_argument,
00048 ">>> ERROR (ArrayTools::scalarMultiplyDataField): Input fields container must have rank 3, 4, or 5.");
00049 TEST_FOR_EXCEPTION( (outputFields.rank() != inputFields.rank()), std::invalid_argument,
00050 ">>> ERROR (ArrayTools::scalarMultiplyDataField): Input and output fields containers must have the same rank.");
00051 TEST_FOR_EXCEPTION( (inputFields.dimension(0) != inputData.dimension(0) ), std::invalid_argument,
00052 ">>> ERROR (ArrayTools::scalarMultiplyDataField): Zeroth dimensions (number of integration domains) of the fields and data input containers must agree!");
00053 TEST_FOR_EXCEPTION( ( (inputFields.dimension(2) != inputData.dimension(1)) && (inputData.dimension(1) != 1) ), std::invalid_argument,
00054 ">>> ERROR (ArrayTools::scalarMultiplyDataField): 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!");
00055 for (int i=0; i<inputFields.rank(); i++) {
00056 std::string errmsg = ">>> ERROR (ArrayTools::scalarMultiplyDataField): Dimension ";
00057 errmsg += (char)(48+i);
00058 errmsg += " of the input and output fields containers must agree!";
00059 TEST_FOR_EXCEPTION( (inputFields.dimension(i) != outputFields.dimension(i)), std::invalid_argument, errmsg );
00060 }
00061 }
00062 else {
00063 TEST_FOR_EXCEPTION( ( (inputFields.rank() < 2) || (inputFields.rank() > 4) ), std::invalid_argument,
00064 ">>> ERROR (ArrayTools::scalarMultiplyDataField): Input fields container must have rank 2, 3, or 4.");
00065 TEST_FOR_EXCEPTION( (outputFields.rank() != inputFields.rank()+1), std::invalid_argument,
00066 ">>> ERROR (ArrayTools::scalarMultiplyDataField): The rank of the input fields container must be one less than the rank of the output fields container.");
00067 TEST_FOR_EXCEPTION( ( (inputFields.dimension(1) != inputData.dimension(1)) && (inputData.dimension(1) != 1) ), std::invalid_argument,
00068 ">>> ERROR (ArrayTools::scalarMultiplyDataField): First dimensions of fields input container and data input container (number of integration points) must agree or first data dimension must be 1!");
00069 TEST_FOR_EXCEPTION( ( inputData.dimension(0) != outputFields.dimension(0) ), std::invalid_argument,
00070 ">>> ERROR (ArrayTools::scalarMultiplyDataField): Zeroth dimensions of fields output container and data input containers (number of integration domains) must agree!");
00071 for (int i=0; i<inputFields.rank(); i++) {
00072 std::string errmsg = ">>> ERROR (ArrayTools::scalarMultiplyDataField): Dimensions ";
00073 errmsg += (char)(48+i);
00074 errmsg += " and ";
00075 errmsg += (char)(48+i+1);
00076 errmsg += " of the input and output fields containers must agree!";
00077 TEST_FOR_EXCEPTION( (inputFields.dimension(i) != outputFields.dimension(i+1)), std::invalid_argument, errmsg );
00078 }
00079 }
00080 #endif
00081
00082
00083 int invalRank = inputFields.rank();
00084 int outvalRank = outputFields.rank();
00085 int numCells = outputFields.dimension(0);
00086 int numFields = outputFields.dimension(1);
00087 int numPoints = outputFields.dimension(2);
00088 int numDataPoints = inputData.dimension(1);
00089 int dim1Tens = 0;
00090 int dim2Tens = 0;
00091 if (outvalRank > 3) {
00092 dim1Tens = outputFields.dimension(3);
00093 if (outvalRank > 4) {
00094 dim2Tens = outputFields.dimension(4);
00095 }
00096 }
00097
00098 if (outvalRank == invalRank) {
00099
00100 if (numDataPoints != 1) {
00101
00102 switch(invalRank) {
00103 case 3: {
00104 if (reciprocal) {
00105 for(int cl = 0; cl < numCells; cl++) {
00106 for(int bf = 0; bf < numFields; bf++) {
00107 for(int pt = 0; pt < numPoints; pt++) {
00108 outputFields(cl, bf, pt) = inputFields(cl, bf, pt)/inputData(cl, pt);
00109 }
00110 }
00111 }
00112 }
00113 else {
00114 for(int cl = 0; cl < numCells; cl++) {
00115 for(int bf = 0; bf < numFields; bf++) {
00116 for(int pt = 0; pt < numPoints; pt++) {
00117 outputFields(cl, bf, pt) = inputFields(cl, bf, pt)*inputData(cl, pt);
00118 }
00119 }
00120 }
00121 }
00122 }
00123 break;
00124
00125 case 4: {
00126 if (reciprocal) {
00127 for(int cl = 0; cl < numCells; cl++) {
00128 for(int bf = 0; bf < numFields; bf++) {
00129 for(int pt = 0; pt < numPoints; pt++) {
00130 for( int iVec = 0; iVec < dim1Tens; iVec++) {
00131 outputFields(cl, bf, pt, iVec) = inputFields(cl, bf, pt, iVec)/inputData(cl, pt);
00132 }
00133 }
00134 }
00135 }
00136 }
00137 else {
00138 for(int cl = 0; cl < numCells; cl++) {
00139 for(int bf = 0; bf < numFields; bf++) {
00140 for(int pt = 0; pt < numPoints; pt++) {
00141 for( int iVec = 0; iVec < dim1Tens; iVec++) {
00142 outputFields(cl, bf, pt, iVec) = inputFields(cl, bf, pt, iVec)*inputData(cl, pt);
00143 }
00144 }
00145 }
00146 }
00147 }
00148 }
00149 break;
00150
00151 case 5: {
00152 if (reciprocal) {
00153 for(int cl = 0; cl < numCells; cl++) {
00154 for(int bf = 0; bf < numFields; bf++) {
00155 for(int pt = 0; pt < numPoints; pt++) {
00156 for( int iTens1 = 0; iTens1 < dim1Tens; iTens1++) {
00157 for( int iTens2 = 0; iTens2 < dim2Tens; iTens2++) {
00158 outputFields(cl, bf, pt, iTens1, iTens2) = inputFields(cl, bf, pt, iTens1, iTens2)/inputData(cl, pt);
00159 }
00160 }
00161 }
00162 }
00163 }
00164 }
00165 else {
00166 for(int cl = 0; cl < numCells; cl++) {
00167 for(int bf = 0; bf < numFields; bf++) {
00168 for(int pt = 0; pt < numPoints; pt++) {
00169 for( int iTens1 = 0; iTens1 < dim1Tens; iTens1++) {
00170 for( int iTens2 = 0; iTens2 < dim2Tens; iTens2++) {
00171 outputFields(cl, bf, pt, iTens1, iTens2) = inputFields(cl, bf, pt, iTens1, iTens2)*inputData(cl, pt);
00172 }
00173 }
00174 }
00175 }
00176 }
00177 }
00178 }
00179 break;
00180
00181 default:
00182 TEST_FOR_EXCEPTION( !( (invalRank == 3) || (invalRank == 4) || (invalRank == 5) ), std::invalid_argument,
00183 ">>> ERROR (ArrayTools::scalarMultiplyDataField): This branch of the method is defined only for rank-3,4 or 5 containers.");
00184 }
00185
00186 }
00187 else {
00188
00189 switch(invalRank) {
00190 case 3: {
00191 if (reciprocal) {
00192 for(int cl = 0; cl < numCells; cl++) {
00193 for(int bf = 0; bf < numFields; bf++) {
00194 for(int pt = 0; pt < numPoints; pt++) {
00195 outputFields(cl, bf, pt) = inputFields(cl, bf, pt)/inputData(cl, 0);
00196 }
00197 }
00198 }
00199 }
00200 else {
00201 for(int cl = 0; cl < numCells; cl++) {
00202 for(int bf = 0; bf < numFields; bf++) {
00203 for(int pt = 0; pt < numPoints; pt++) {
00204 outputFields(cl, bf, pt) = inputFields(cl, bf, pt)*inputData(cl, 0);
00205 }
00206 }
00207 }
00208 }
00209 }
00210 break;
00211
00212 case 4: {
00213 if (reciprocal) {
00214 for(int cl = 0; cl < numCells; cl++) {
00215 for(int bf = 0; bf < numFields; bf++) {
00216 for(int pt = 0; pt < numPoints; pt++) {
00217 for( int iVec = 0; iVec < dim1Tens; iVec++) {
00218 outputFields(cl, bf, pt, iVec) = inputFields(cl, bf, pt, iVec)/inputData(cl, 0);
00219 }
00220 }
00221 }
00222 }
00223 }
00224 else {
00225 for(int cl = 0; cl < numCells; cl++) {
00226 for(int bf = 0; bf < numFields; bf++) {
00227 for(int pt = 0; pt < numPoints; pt++) {
00228 for( int iVec = 0; iVec < dim1Tens; iVec++) {
00229 outputFields(cl, bf, pt, iVec) = inputFields(cl, bf, pt, iVec)*inputData(cl, 0);
00230 }
00231 }
00232 }
00233 }
00234 }
00235 }
00236 break;
00237
00238 case 5: {
00239 if (reciprocal) {
00240 for(int cl = 0; cl < numCells; cl++) {
00241 for(int bf = 0; bf < numFields; bf++) {
00242 for(int pt = 0; pt < numPoints; pt++) {
00243 for( int iTens1 = 0; iTens1 < dim1Tens; iTens1++) {
00244 for( int iTens2 = 0; iTens2 < dim2Tens; iTens2++) {
00245 outputFields(cl, bf, pt, iTens1, iTens2) = inputFields(cl, bf, pt, iTens1, iTens2)/inputData(cl, 0);
00246 }
00247 }
00248 }
00249 }
00250 }
00251 }
00252 else {
00253 for(int cl = 0; cl < numCells; cl++) {
00254 for(int bf = 0; bf < numFields; bf++) {
00255 for(int pt = 0; pt < numPoints; pt++) {
00256 for( int iTens1 = 0; iTens1 < dim1Tens; iTens1++) {
00257 for( int iTens2 = 0; iTens2 < dim2Tens; iTens2++) {
00258 outputFields(cl, bf, pt, iTens1, iTens2) = inputFields(cl, bf, pt, iTens1, iTens2)*inputData(cl, 0);
00259 }
00260 }
00261 }
00262 }
00263 }
00264 }
00265 }
00266 break;
00267
00268 default:
00269 TEST_FOR_EXCEPTION( !( (invalRank == 3) || (invalRank == 4) || (invalRank == 5) ), std::invalid_argument,
00270 ">>> ERROR (ArrayTools::scalarMultiplyDataField): This branch of the method is defined only for rank-3, 4 or 5 input containers.");
00271
00272 }
00273 }
00274
00275 }
00276 else {
00277
00278 if (numDataPoints != 1) {
00279
00280 switch(invalRank) {
00281 case 2: {
00282 if (reciprocal) {
00283 for(int cl = 0; cl < numCells; cl++) {
00284 for(int bf = 0; bf < numFields; bf++) {
00285 for(int pt = 0; pt < numPoints; pt++) {
00286 outputFields(cl, bf, pt) = inputFields(bf, pt)/inputData(cl, pt);
00287 }
00288 }
00289 }
00290 }
00291 else {
00292 for(int cl = 0; cl < numCells; cl++) {
00293 for(int bf = 0; bf < numFields; bf++) {
00294 for(int pt = 0; pt < numPoints; pt++) {
00295 outputFields(cl, bf, pt) = inputFields(bf, pt)*inputData(cl, pt);
00296 }
00297 }
00298 }
00299 }
00300 }
00301 break;
00302
00303 case 3: {
00304 if (reciprocal) {
00305 for(int cl = 0; cl < numCells; cl++) {
00306 for(int bf = 0; bf < numFields; bf++) {
00307 for(int pt = 0; pt < numPoints; pt++) {
00308 for( int iVec = 0; iVec < dim1Tens; iVec++) {
00309 outputFields(cl, bf, pt, iVec) = inputFields(bf, pt, iVec)/inputData(cl, pt);
00310 }
00311 }
00312 }
00313 }
00314 }
00315 else {
00316 for(int cl = 0; cl < numCells; cl++) {
00317 for(int bf = 0; bf < numFields; bf++) {
00318 for(int pt = 0; pt < numPoints; pt++) {
00319 for( int iVec = 0; iVec < dim1Tens; iVec++) {
00320 outputFields(cl, bf, pt, iVec) = inputFields(bf, pt, iVec)*inputData(cl, pt);
00321 }
00322 }
00323 }
00324 }
00325 }
00326 }
00327 break;
00328
00329 case 4: {
00330 if (reciprocal) {
00331 for(int cl = 0; cl < numCells; cl++) {
00332 for(int bf = 0; bf < numFields; bf++) {
00333 for(int pt = 0; pt < numPoints; pt++) {
00334 for( int iTens1 = 0; iTens1 < dim1Tens; iTens1++) {
00335 for( int iTens2 = 0; iTens2 < dim2Tens; iTens2++) {
00336 outputFields(cl, bf, pt, iTens1, iTens2) = inputFields(bf, pt, iTens1, iTens2)/inputData(cl, pt);
00337 }
00338 }
00339 }
00340 }
00341 }
00342 }
00343 else {
00344 for(int cl = 0; cl < numCells; cl++) {
00345 for(int bf = 0; bf < numFields; bf++) {
00346 for(int pt = 0; pt < numPoints; pt++) {
00347 for( int iTens1 = 0; iTens1 < dim1Tens; iTens1++) {
00348 for( int iTens2 = 0; iTens2 < dim2Tens; iTens2++) {
00349 outputFields(cl, bf, pt, iTens1, iTens2) = inputFields(bf, pt, iTens1, iTens2)*inputData(cl, pt);
00350 }
00351 }
00352 }
00353 }
00354 }
00355 }
00356 }
00357 break;
00358
00359 default:
00360 TEST_FOR_EXCEPTION( !( (invalRank == 2) || (invalRank == 3) || (invalRank == 4) ), std::invalid_argument,
00361 ">>> ERROR (ArrayTools::scalarMultiplyDataField): This branch of the method is defined only for rank-2, 3 or 4 input containers.");
00362 }
00363
00364 }
00365 else {
00366
00367 switch(invalRank) {
00368 case 2: {
00369 if (reciprocal) {
00370 for(int cl = 0; cl < numCells; cl++) {
00371 for(int bf = 0; bf < numFields; bf++) {
00372 for(int pt = 0; pt < numPoints; pt++) {
00373 outputFields(cl, bf, pt) = inputFields(bf, pt)/inputData(cl, 0);
00374 }
00375 }
00376 }
00377 }
00378 else {
00379 for(int cl = 0; cl < numCells; cl++) {
00380 for(int bf = 0; bf < numFields; bf++) {
00381 for(int pt = 0; pt < numPoints; pt++) {
00382 outputFields(cl, bf, pt) = inputFields(bf, pt)*inputData(cl, 0);
00383 }
00384 }
00385 }
00386 }
00387 }
00388 break;
00389
00390 case 3: {
00391 if (reciprocal) {
00392 for(int cl = 0; cl < numCells; cl++) {
00393 for(int bf = 0; bf < numFields; bf++) {
00394 for(int pt = 0; pt < numPoints; pt++) {
00395 for( int iVec = 0; iVec < dim1Tens; iVec++) {
00396 outputFields(cl, bf, pt, iVec) = inputFields(bf, pt, iVec)/inputData(cl, 0);
00397 }
00398 }
00399 }
00400 }
00401 }
00402 else {
00403 for(int cl = 0; cl < numCells; cl++) {
00404 for(int bf = 0; bf < numFields; bf++) {
00405 for(int pt = 0; pt < numPoints; pt++) {
00406 for( int iVec = 0; iVec < dim1Tens; iVec++) {
00407 outputFields(cl, bf, pt, iVec) = inputFields(bf, pt, iVec)*inputData(cl, 0);
00408 }
00409 }
00410 }
00411 }
00412 }
00413 }
00414 break;
00415
00416 case 4: {
00417 if (reciprocal) {
00418 for(int cl = 0; cl < numCells; cl++) {
00419 for(int bf = 0; bf < numFields; bf++) {
00420 for(int pt = 0; pt < numPoints; pt++) {
00421 for( int iTens1 = 0; iTens1 < dim1Tens; iTens1++) {
00422 for( int iTens2 = 0; iTens2 < dim2Tens; iTens2++) {
00423 outputFields(cl, bf, pt, iTens1, iTens2) = inputFields(bf, pt, iTens1, iTens2)/inputData(cl, 0);
00424 }
00425 }
00426 }
00427 }
00428 }
00429 }
00430 else {
00431 for(int cl = 0; cl < numCells; cl++) {
00432 for(int bf = 0; bf < numFields; bf++) {
00433 for(int pt = 0; pt < numPoints; pt++) {
00434 for( int iTens1 = 0; iTens1 < dim1Tens; iTens1++) {
00435 for( int iTens2 = 0; iTens2 < dim2Tens; iTens2++) {
00436 outputFields(cl, bf, pt, iTens1, iTens2) = inputFields(bf, pt, iTens1, iTens2)*inputData(cl, 0);
00437 }
00438 }
00439 }
00440 }
00441 }
00442 }
00443 }
00444 break;
00445
00446 default:
00447 TEST_FOR_EXCEPTION( !( (invalRank == 2) || (invalRank == 3) || (invalRank == 3) ), std::invalid_argument,
00448 ">>> ERROR (ArrayTools::scalarMultiplyDataField): This branch of the method is defined only for rank-2, 3 or 4 input containers.");
00449
00450 }
00451 }
00452
00453 }
00454
00455 }
00456
00457
00458
00459 template<class Scalar, class ArrayOutData, class ArrayInDataLeft, class ArrayInDataRight>
00460 void ArrayTools::scalarMultiplyDataData(ArrayOutData & outputData,
00461 ArrayInDataLeft & inputDataLeft,
00462 ArrayInDataRight & inputDataRight,
00463 const bool reciprocal) {
00464
00465 #ifdef HAVE_INTREPID_DEBUG
00466 TEST_FOR_EXCEPTION( (inputDataLeft.rank() != 2), std::invalid_argument,
00467 ">>> ERROR (ArrayTools::scalarMultiplyDataData): Left input data container must have rank 2.");
00468 if (outputData.rank() <= inputDataRight.rank()) {
00469 TEST_FOR_EXCEPTION( ( (inputDataRight.rank() < 2) || (inputDataRight.rank() > 4) ), std::invalid_argument,
00470 ">>> ERROR (ArrayTools::scalarMultiplyDataData): Right input data container must have rank 2, 3, or 4.");
00471 TEST_FOR_EXCEPTION( (outputData.rank() != inputDataRight.rank()), std::invalid_argument,
00472 ">>> ERROR (ArrayTools::scalarMultiplyDataData): Right input and output data containers must have the same rank.");
00473 TEST_FOR_EXCEPTION( (inputDataRight.dimension(0) != inputDataLeft.dimension(0) ), std::invalid_argument,
00474 ">>> ERROR (ArrayTools::scalarMultiplyDataData): Zeroth dimensions (number of integration domains) of the left and right data input containers must agree!");
00475 TEST_FOR_EXCEPTION( ( (inputDataRight.dimension(1) != inputDataLeft.dimension(1)) && (inputDataLeft.dimension(1) != 1) ), std::invalid_argument,
00476 ">>> ERROR (ArrayTools::scalarMultiplyDataData): First dimensions of the left and right data input containers (number of integration points) must agree or first dimension of the left data input container must be 1!");
00477 for (int i=0; i<inputDataRight.rank(); i++) {
00478 std::string errmsg = ">>> ERROR (ArrayTools::scalarMultiplyDataData): Dimension ";
00479 errmsg += (char)(48+i);
00480 errmsg += " of the right input and output data containers must agree!";
00481 TEST_FOR_EXCEPTION( (inputDataRight.dimension(i) != outputData.dimension(i)), std::invalid_argument, errmsg );
00482 }
00483 }
00484 else {
00485 TEST_FOR_EXCEPTION( ( (inputDataRight.rank() < 1) || (inputDataRight.rank() > 3) ), std::invalid_argument,
00486 ">>> ERROR (ArrayTools::scalarMultiplyDataData): Right input data container must have rank 1, 2, or 3.");
00487 TEST_FOR_EXCEPTION( (outputData.rank() != inputDataRight.rank()+1), std::invalid_argument,
00488 ">>> ERROR (ArrayTools::scalarMultiplyDataData): The rank of the right input data container must be one less than the rank of the output data container.");
00489 TEST_FOR_EXCEPTION( ( (inputDataRight.dimension(0) != inputDataLeft.dimension(1)) && (inputDataLeft.dimension(1) != 1) ), std::invalid_argument,
00490 ">>> ERROR (ArrayTools::scalarMultiplyDataData): Zeroth dimension of the right input data container and first dimension of the left data input container (number of integration points) must agree or first dimension of the left data input container must be 1!");
00491 TEST_FOR_EXCEPTION( ( inputDataLeft.dimension(0) != outputData.dimension(0) ), std::invalid_argument,
00492 ">>> ERROR (ArrayTools::scalarMultiplyDataData): Zeroth dimensions of data output and left data input containers (number of integration domains) must agree!");
00493 for (int i=0; i<inputDataRight.rank(); i++) {
00494 std::string errmsg = ">>> ERROR (ArrayTools::scalarMultiplyDataData): Dimensions ";
00495 errmsg += (char)(48+i);
00496 errmsg += " and ";
00497 errmsg += (char)(48+i+1);
00498 errmsg += " of the right input and output data containers must agree!";
00499 TEST_FOR_EXCEPTION( (inputDataRight.dimension(i) != outputData.dimension(i+1)), std::invalid_argument, errmsg );
00500 }
00501 }
00502 #endif
00503
00504
00505 int invalRank = inputDataRight.rank();
00506 int outvalRank = outputData.rank();
00507 int numCells = outputData.dimension(0);
00508 int numPoints = outputData.dimension(1);
00509 int numDataPoints = inputDataLeft.dimension(1);
00510 int dim1Tens = 0;
00511 int dim2Tens = 0;
00512 if (outvalRank > 2) {
00513 dim1Tens = outputData.dimension(2);
00514 if (outvalRank > 3) {
00515 dim2Tens = outputData.dimension(3);
00516 }
00517 }
00518
00519 if (outvalRank == invalRank) {
00520
00521 if (numDataPoints != 1) {
00522
00523 switch(invalRank) {
00524 case 2: {
00525 if (reciprocal) {
00526 for(int cl = 0; cl < numCells; cl++) {
00527 for(int pt = 0; pt < numPoints; pt++) {
00528 outputData(cl, pt) = inputDataRight(cl, pt)/inputDataLeft(cl, pt);
00529 }
00530 }
00531 }
00532 else {
00533 for(int cl = 0; cl < numCells; cl++) {
00534 for(int pt = 0; pt < numPoints; pt++) {
00535 outputData(cl, pt) = inputDataRight(cl, pt)*inputDataLeft(cl, pt);
00536 }
00537 }
00538 }
00539 }
00540 break;
00541
00542 case 3: {
00543 if (reciprocal) {
00544 for(int cl = 0; cl < numCells; cl++) {
00545 for(int pt = 0; pt < numPoints; pt++) {
00546 for( int iVec = 0; iVec < dim1Tens; iVec++) {
00547 outputData(cl, pt, iVec) = inputDataRight(cl, pt, iVec)/inputDataLeft(cl, pt);
00548 }
00549 }
00550 }
00551 }
00552 else {
00553 for(int cl = 0; cl < numCells; cl++) {
00554 for(int pt = 0; pt < numPoints; pt++) {
00555 for( int iVec = 0; iVec < dim1Tens; iVec++) {
00556 outputData(cl, pt, iVec) = inputDataRight(cl, pt, iVec)*inputDataLeft(cl, pt);
00557 }
00558 }
00559 }
00560 }
00561 }
00562 break;
00563
00564 case 4: {
00565 if (reciprocal) {
00566 for(int cl = 0; cl < numCells; cl++) {
00567 for(int pt = 0; pt < numPoints; pt++) {
00568 for( int iTens1 = 0; iTens1 < dim1Tens; iTens1++) {
00569 for( int iTens2 = 0; iTens2 < dim2Tens; iTens2++) {
00570 outputData(cl, pt, iTens1, iTens2) = inputDataRight(cl, pt, iTens1, iTens2)/inputDataLeft(cl, pt);
00571 }
00572 }
00573 }
00574 }
00575 }
00576 else {
00577 for(int cl = 0; cl < numCells; cl++) {
00578 for(int pt = 0; pt < numPoints; pt++) {
00579 for( int iTens1 = 0; iTens1 < dim1Tens; iTens1++) {
00580 for( int iTens2 = 0; iTens2 < dim2Tens; iTens2++) {
00581 outputData(cl, pt, iTens1, iTens2) = inputDataRight(cl, pt, iTens1, iTens2)*inputDataLeft(cl, pt);
00582 }
00583 }
00584 }
00585 }
00586 }
00587 }
00588 break;
00589
00590 default:
00591 TEST_FOR_EXCEPTION( !( (invalRank == 2) || (invalRank == 3) || (invalRank == 4) ), std::invalid_argument,
00592 ">>> ERROR (ArrayTools::scalarMultiplyDataData): This branch of the method is defined only for rank-2, 3 or 4 containers.");
00593 }
00594
00595 }
00596 else {
00597
00598 switch(invalRank) {
00599 case 2: {
00600 if (reciprocal) {
00601 for(int cl = 0; cl < numCells; cl++) {
00602 for(int pt = 0; pt < numPoints; pt++) {
00603 outputData(cl, pt) = inputDataRight(cl, pt)/inputDataLeft(cl, 0);
00604 }
00605 }
00606 }
00607 else {
00608 for(int cl = 0; cl < numCells; cl++) {
00609 for(int pt = 0; pt < numPoints; pt++) {
00610 outputData(cl, pt) = inputDataRight(cl, pt)*inputDataLeft(cl, 0);
00611 }
00612 }
00613 }
00614 }
00615 break;
00616
00617 case 3: {
00618 if (reciprocal) {
00619 for(int cl = 0; cl < numCells; cl++) {
00620 for(int pt = 0; pt < numPoints; pt++) {
00621 for( int iVec = 0; iVec < dim1Tens; iVec++) {
00622 outputData(cl, pt, iVec) = inputDataRight(cl, pt, iVec)/inputDataLeft(cl, 0);
00623 }
00624 }
00625 }
00626 }
00627 else {
00628 for(int cl = 0; cl < numCells; cl++) {
00629 for(int pt = 0; pt < numPoints; pt++) {
00630 for( int iVec = 0; iVec < dim1Tens; iVec++) {
00631 outputData(cl, pt, iVec) = inputDataRight(cl, pt, iVec)*inputDataLeft(cl, 0);
00632 }
00633 }
00634 }
00635 }
00636 }
00637 break;
00638
00639 case 4: {
00640 if (reciprocal) {
00641 for(int cl = 0; cl < numCells; cl++) {
00642 for(int pt = 0; pt < numPoints; pt++) {
00643 for( int iTens1 = 0; iTens1 < dim1Tens; iTens1++) {
00644 for( int iTens2 = 0; iTens2 < dim2Tens; iTens2++) {
00645 outputData(cl, pt, iTens1, iTens2) = inputDataRight(cl, pt, iTens1, iTens2)/inputDataLeft(cl, 0);
00646 }
00647 }
00648 }
00649 }
00650 }
00651 else {
00652 for(int cl = 0; cl < numCells; cl++) {
00653 for(int pt = 0; pt < numPoints; pt++) {
00654 for( int iTens1 = 0; iTens1 < dim1Tens; iTens1++) {
00655 for( int iTens2 = 0; iTens2 < dim2Tens; iTens2++) {
00656 outputData(cl, pt, iTens1, iTens2) = inputDataRight(cl, pt, iTens1, iTens2)*inputDataLeft(cl, 0);
00657 }
00658 }
00659 }
00660 }
00661 }
00662 }
00663 break;
00664
00665 default:
00666 TEST_FOR_EXCEPTION( !( (invalRank == 2) || (invalRank == 3) || (invalRank == 4) ), std::invalid_argument,
00667 ">>> ERROR (ArrayTools::scalarMultiplyDataData): This branch of the method is defined only for rank-2, 3 or 4 input containers.");
00668
00669 }
00670 }
00671
00672 }
00673 else {
00674
00675 if (numDataPoints != 1) {
00676
00677 switch(invalRank) {
00678 case 1: {
00679 if (reciprocal) {
00680 for(int cl = 0; cl < numCells; cl++) {
00681 for(int pt = 0; pt < numPoints; pt++) {
00682 outputData(cl, pt) = inputDataRight(pt)/inputDataLeft(cl, pt);
00683 }
00684 }
00685 }
00686 else {
00687 for(int cl = 0; cl < numCells; cl++) {
00688 for(int pt = 0; pt < numPoints; pt++) {
00689 outputData(cl, pt) = inputDataRight(pt)*inputDataLeft(cl, pt);
00690 }
00691 }
00692 }
00693 }
00694 break;
00695
00696 case 2: {
00697 if (reciprocal) {
00698 for(int cl = 0; cl < numCells; cl++) {
00699 for(int pt = 0; pt < numPoints; pt++) {
00700 for( int iVec = 0; iVec < dim1Tens; iVec++) {
00701 outputData(cl, pt, iVec) = inputDataRight(pt, iVec)/inputDataLeft(cl, pt);
00702 }
00703 }
00704 }
00705 }
00706 else {
00707 for(int cl = 0; cl < numCells; cl++) {
00708 for(int pt = 0; pt < numPoints; pt++) {
00709 for( int iVec = 0; iVec < dim1Tens; iVec++) {
00710 outputData(cl, pt, iVec) = inputDataRight(pt, iVec)*inputDataLeft(cl, pt);
00711 }
00712 }
00713 }
00714 }
00715 }
00716 break;
00717
00718 case 3: {
00719 if (reciprocal) {
00720 for(int cl = 0; cl < numCells; cl++) {
00721 for(int pt = 0; pt < numPoints; pt++) {
00722 for( int iTens1 = 0; iTens1 < dim1Tens; iTens1++) {
00723 for( int iTens2 = 0; iTens2 < dim2Tens; iTens2++) {
00724 outputData(cl, pt, iTens1, iTens2) = inputDataRight(pt, iTens1, iTens2)/inputDataLeft(cl, pt);
00725 }
00726 }
00727 }
00728 }
00729 }
00730 else {
00731 for(int cl = 0; cl < numCells; cl++) {
00732 for(int pt = 0; pt < numPoints; pt++) {
00733 for( int iTens1 = 0; iTens1 < dim1Tens; iTens1++) {
00734 for( int iTens2 = 0; iTens2 < dim2Tens; iTens2++) {
00735 outputData(cl, pt, iTens1, iTens2) = inputDataRight(pt, iTens1, iTens2)*inputDataLeft(cl, pt);
00736 }
00737 }
00738 }
00739 }
00740 }
00741 }
00742 break;
00743
00744 default:
00745 TEST_FOR_EXCEPTION( !( (invalRank == 1) || (invalRank == 2) || (invalRank == 3) ), std::invalid_argument,
00746 ">>> ERROR (ArrayTools::scalarMultiplyDataData): This branch of the method is defined only for rank-1, 2 or 3 input containers.");
00747 }
00748
00749 }
00750 else {
00751
00752 switch(invalRank) {
00753 case 1: {
00754 if (reciprocal) {
00755 for(int cl = 0; cl < numCells; cl++) {
00756 for(int pt = 0; pt < numPoints; pt++) {
00757 outputData(cl, pt) = inputDataRight(pt)/inputDataLeft(cl, 0);
00758 }
00759 }
00760 }
00761 else {
00762 for(int cl = 0; cl < numCells; cl++) {
00763 for(int pt = 0; pt < numPoints; pt++) {
00764 outputData(cl, pt) = inputDataRight(pt)*inputDataLeft(cl, 0);
00765 }
00766 }
00767 }
00768 }
00769 break;
00770
00771 case 2: {
00772 if (reciprocal) {
00773 for(int cl = 0; cl < numCells; cl++) {
00774 for(int pt = 0; pt < numPoints; pt++) {
00775 for( int iVec = 0; iVec < dim1Tens; iVec++) {
00776 outputData(cl, pt, iVec) = inputDataRight(pt, iVec)/inputDataLeft(cl, 0);
00777 }
00778 }
00779 }
00780 }
00781 else {
00782 for(int cl = 0; cl < numCells; cl++) {
00783 for(int pt = 0; pt < numPoints; pt++) {
00784 for( int iVec = 0; iVec < dim1Tens; iVec++) {
00785 outputData(cl, pt, iVec) = inputDataRight(pt, iVec)*inputDataLeft(cl, 0);
00786 }
00787 }
00788 }
00789 }
00790 }
00791 break;
00792
00793 case 3: {
00794 if (reciprocal) {
00795 for(int cl = 0; cl < numCells; cl++) {
00796 for(int pt = 0; pt < numPoints; pt++) {
00797 for( int iTens1 = 0; iTens1 < dim1Tens; iTens1++) {
00798 for( int iTens2 = 0; iTens2 < dim2Tens; iTens2++) {
00799 outputData(cl, pt, iTens1, iTens2) = inputDataRight(pt, iTens1, iTens2)/inputDataLeft(cl, 0);
00800 }
00801 }
00802 }
00803 }
00804 }
00805 else {
00806 for(int cl = 0; cl < numCells; cl++) {
00807 for(int pt = 0; pt < numPoints; pt++) {
00808 for( int iTens1 = 0; iTens1 < dim1Tens; iTens1++) {
00809 for( int iTens2 = 0; iTens2 < dim2Tens; iTens2++) {
00810 outputData(cl, pt, iTens1, iTens2) = inputDataRight(pt, iTens1, iTens2)*inputDataLeft(cl, 0);
00811 }
00812 }
00813 }
00814 }
00815 }
00816 }
00817 break;
00818
00819 default:
00820 TEST_FOR_EXCEPTION( !( (invalRank == 1) || (invalRank == 2) || (invalRank == 3) ), std::invalid_argument,
00821 ">>> ERROR (ArrayTools::scalarMultiplyDataData): This branch of the method is defined only for rank-1, 2 or 3 input containers.");
00822
00823 }
00824 }
00825
00826 }
00827
00828 }
00829
00830 }