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
00038 template<class Scalar, class ArrayOutFields, class ArrayInFields>
00039 void ArrayTools::cloneFields(ArrayOutFields & outputFields,
00040 const ArrayInFields & inputFields) {
00041
00042 #ifdef HAVE_INTREPID_DEBUG
00043 TEST_FOR_EXCEPTION( ( (inputFields.rank() < 2) || (inputFields.rank() > 4) ), std::invalid_argument,
00044 ">>> ERROR (ArrayTools::cloneFields): Input fields container must have rank 2, 3, or 4.");
00045 TEST_FOR_EXCEPTION( (outputFields.rank() != inputFields.rank()+1), std::invalid_argument,
00046 ">>> ERROR (ArrayTools::cloneFields): The rank of the input fields container must be one less than the rank of the output fields container.");
00047 for (int i=0; i<inputFields.rank(); i++) {
00048 std::string errmsg = ">>> ERROR (ArrayTools::cloneFields): Dimensions ";
00049 errmsg += (char)(48+i);
00050 errmsg += " and ";
00051 errmsg += (char)(48+i+1);
00052 errmsg += " of the input and output fields containers must agree!";
00053 TEST_FOR_EXCEPTION( (inputFields.dimension(i) != outputFields.dimension(i+1)), std::invalid_argument, errmsg );
00054 }
00055 #endif
00056
00057
00058 int invalRank = inputFields.rank();
00059 int outvalRank = outputFields.rank();
00060 int numCells = outputFields.dimension(0);
00061 int numFields = outputFields.dimension(1);
00062 int numPoints = outputFields.dimension(2);
00063 int dim1Tens = 0;
00064 int dim2Tens = 0;
00065 if (outvalRank > 3) {
00066 dim1Tens = outputFields.dimension(3);
00067 if (outvalRank > 4) {
00068 dim2Tens = outputFields.dimension(4);
00069 }
00070 }
00071
00072 switch(invalRank) {
00073 case 2: {
00074 for(int cl = 0; cl < numCells; cl++) {
00075 for(int bf = 0; bf < numFields; bf++) {
00076 for(int pt = 0; pt < numPoints; pt++) {
00077 outputFields(cl, bf, pt) = inputFields(bf, pt);
00078 }
00079 }
00080 }
00081 }
00082 break;
00083
00084 case 3: {
00085 for(int cl = 0; cl < numCells; cl++) {
00086 for(int bf = 0; bf < numFields; bf++) {
00087 for(int pt = 0; pt < numPoints; pt++) {
00088 for( int iVec = 0; iVec < dim1Tens; iVec++) {
00089 outputFields(cl, bf, pt, iVec) = inputFields(bf, pt, iVec);
00090 }
00091 }
00092 }
00093 }
00094 }
00095 break;
00096
00097 case 4: {
00098 for(int cl = 0; cl < numCells; cl++) {
00099 for(int bf = 0; bf < numFields; bf++) {
00100 for(int pt = 0; pt < numPoints; pt++) {
00101 for( int iTens1 = 0; iTens1 < dim1Tens; iTens1++) {
00102 for( int iTens2 = 0; iTens2 < dim2Tens; iTens2++) {
00103 outputFields(cl, bf, pt, iTens1, iTens2) = inputFields(bf, pt, iTens1, iTens2);
00104 }
00105 }
00106 }
00107 }
00108 }
00109 }
00110 break;
00111
00112 default:
00113 TEST_FOR_EXCEPTION( !( (invalRank == 2) || (invalRank == 3) || (invalRank == 4) ), std::invalid_argument,
00114 ">>> ERROR (ArrayTools::cloneFields): This method is defined only for rank-2, 3 or 4 input containers.");
00115 }
00116
00117 }
00118
00119
00120 template<class Scalar, class ArrayOutFields, class ArrayInFactors, class ArrayInFields>
00121 void ArrayTools::cloneScaleFields(ArrayOutFields & outputFields,
00122 const ArrayInFactors & inputFactors,
00123 const ArrayInFields & inputFields) {
00124
00125 #ifdef HAVE_INTREPID_DEBUG
00126 TEST_FOR_EXCEPTION( (inputFactors.rank() != 2), std::invalid_argument,
00127 ">>> ERROR (ArrayTools::cloneScaleFields): The rank of the input factors container must be 2.");
00128 TEST_FOR_EXCEPTION( ( (inputFields.rank() < 2) || (inputFields.rank() > 4) ), std::invalid_argument,
00129 ">>> ERROR (ArrayTools::cloneScaleFields): Input fields container must have rank 2, 3, or 4.");
00130 TEST_FOR_EXCEPTION( (outputFields.rank() != inputFields.rank()+1), std::invalid_argument,
00131 ">>> ERROR (ArrayTools::cloneScaleFields): The rank of the input fields container must be one less than the rank of the output fields container.");
00132 TEST_FOR_EXCEPTION( ( inputFactors.dimension(0) != outputFields.dimension(0) ), std::invalid_argument,
00133 ">>> ERROR (ArrayTools::cloneScaleFields): Zeroth dimensions of input factors container and output fields container (numbers of integration domains) must agree!");
00134 TEST_FOR_EXCEPTION( ( inputFactors.dimension(1) != outputFields.dimension(1) ), std::invalid_argument,
00135 ">>> ERROR (ArrayTools::cloneScaleFields): First dimensions of input factors container and output fields container (numbers of fields) must agree!");
00136 for (int i=0; i<inputFields.rank(); i++) {
00137 std::string errmsg = ">>> ERROR (ArrayTools::cloneScaleFields): Dimensions ";
00138 errmsg += (char)(48+i);
00139 errmsg += " and ";
00140 errmsg += (char)(48+i+1);
00141 errmsg += " of the input and output fields containers must agree!";
00142 TEST_FOR_EXCEPTION( (inputFields.dimension(i) != outputFields.dimension(i+1)), std::invalid_argument, errmsg );
00143 }
00144 #endif
00145
00146
00147 int invalRank = inputFields.rank();
00148 int outvalRank = outputFields.rank();
00149 int numCells = outputFields.dimension(0);
00150 int numFields = outputFields.dimension(1);
00151 int numPoints = outputFields.dimension(2);
00152 int dim1Tens = 0;
00153 int dim2Tens = 0;
00154 if (outvalRank > 3) {
00155 dim1Tens = outputFields.dimension(3);
00156 if (outvalRank > 4) {
00157 dim2Tens = outputFields.dimension(4);
00158 }
00159 }
00160
00161 switch(invalRank) {
00162 case 2: {
00163 for(int cl = 0; cl < numCells; cl++) {
00164 for(int bf = 0; bf < numFields; bf++) {
00165 for(int pt = 0; pt < numPoints; pt++) {
00166 outputFields(cl, bf, pt) = inputFields(bf, pt) * inputFactors(cl, bf);
00167 }
00168 }
00169 }
00170 }
00171 break;
00172
00173 case 3: {
00174 for(int cl = 0; cl < numCells; cl++) {
00175 for(int bf = 0; bf < numFields; bf++) {
00176 for(int pt = 0; pt < numPoints; pt++) {
00177 for( int iVec = 0; iVec < dim1Tens; iVec++) {
00178 outputFields(cl, bf, pt, iVec) = inputFields(bf, pt, iVec) * inputFactors(cl, bf);
00179 }
00180 }
00181 }
00182 }
00183 }
00184 break;
00185
00186 case 4: {
00187 for(int cl = 0; cl < numCells; cl++) {
00188 for(int bf = 0; bf < numFields; bf++) {
00189 for(int pt = 0; pt < numPoints; pt++) {
00190 for( int iTens1 = 0; iTens1 < dim1Tens; iTens1++) {
00191 for( int iTens2 = 0; iTens2 < dim2Tens; iTens2++) {
00192 outputFields(cl, bf, pt, iTens1, iTens2) = inputFields(bf, pt, iTens1, iTens2) * inputFactors(cl, bf);
00193 }
00194 }
00195 }
00196 }
00197 }
00198 }
00199 break;
00200
00201 default:
00202 TEST_FOR_EXCEPTION( !( (invalRank == 2) || (invalRank == 3) || (invalRank == 4) ), std::invalid_argument,
00203 ">>> ERROR (ArrayTools::cloneScaleFields): This method is defined only for rank-2, 3 or 4 input containers.");
00204 }
00205
00206 }
00207
00208
00209 template<class Scalar, class ArrayInOutFields, class ArrayInFactors>
00210 void ArrayTools::scaleFields(ArrayInOutFields & inoutFields,
00211 const ArrayInFactors & inputFactors) {
00212
00213 #ifdef HAVE_INTREPID_DEBUG
00214 TEST_FOR_EXCEPTION( (inputFactors.rank() != 2), std::invalid_argument,
00215 ">>> ERROR (ArrayTools::scaleFields): The rank of the input factors container must be 2.");
00216 TEST_FOR_EXCEPTION( ( (inoutFields.rank() < 3) || (inoutFields.rank() > 5) ), std::invalid_argument,
00217 ">>> ERROR (ArrayTools::scaleFields): Input/output fields container must have rank 3, 4, or 5.");
00218 TEST_FOR_EXCEPTION( ( inputFactors.dimension(0) != inoutFields.dimension(0) ), std::invalid_argument,
00219 ">>> ERROR (ArrayTools::scaleFields): Zeroth dimensions of input factors container and input/output fields container (numbers of integration domains) must agree!");
00220 TEST_FOR_EXCEPTION( ( inputFactors.dimension(1) != inoutFields.dimension(1) ), std::invalid_argument,
00221 ">>> ERROR (ArrayTools::scaleFields): First dimensions (number of fields) of input factors and input/output fields containers must agree!");
00222 #endif
00223
00224
00225 int inoutRank = inoutFields.rank();
00226 int numCells = inoutFields.dimension(0);
00227 int numFields = inoutFields.dimension(1);
00228 int numPoints = inoutFields.dimension(2);
00229 int dim1Tens = 0;
00230 int dim2Tens = 0;
00231 if (inoutRank > 3) {
00232 dim1Tens = inoutFields.dimension(3);
00233 if (inoutRank > 4) {
00234 dim2Tens = inoutFields.dimension(4);
00235 }
00236 }
00237
00238 switch(inoutRank) {
00239 case 3: {
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 inoutFields(cl, bf, pt) = inoutFields(cl, bf, pt) * inputFactors(cl, bf);
00244 }
00245 }
00246 }
00247 }
00248 break;
00249
00250 case 4: {
00251 for(int cl = 0; cl < numCells; cl++) {
00252 for(int bf = 0; bf < numFields; bf++) {
00253 for(int pt = 0; pt < numPoints; pt++) {
00254 for( int iVec = 0; iVec < dim1Tens; iVec++) {
00255 inoutFields(cl, bf, pt, iVec) = inoutFields(cl, bf, pt, iVec) * inputFactors(cl, bf);
00256 }
00257 }
00258 }
00259 }
00260 }
00261 break;
00262
00263 case 5: {
00264 for(int cl = 0; cl < numCells; cl++) {
00265 for(int bf = 0; bf < numFields; bf++) {
00266 for(int pt = 0; pt < numPoints; pt++) {
00267 for( int iTens1 = 0; iTens1 < dim1Tens; iTens1++) {
00268 for( int iTens2 = 0; iTens2 < dim2Tens; iTens2++) {
00269 inoutFields(cl, bf, pt, iTens1, iTens2) = inoutFields(cl, bf, pt, iTens1, iTens2) * inputFactors(cl, bf);
00270 }
00271 }
00272 }
00273 }
00274 }
00275 }
00276 break;
00277
00278 default:
00279 TEST_FOR_EXCEPTION( !( (inoutRank == 3) || (inoutRank == 4) || (inoutRank == 5) ), std::invalid_argument,
00280 ">>> ERROR (ArrayTools::cloneScaleFields): This method is defined only for rank-3, 4 or 5 input/output containers.");
00281 }
00282
00283 }
00284
00285
00286 }