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
00030
00036 namespace Intrepid {
00037
00038 template<class Scalar, class ArrayScalar>
00039 Basis_HCURL_HEX_I1_FEM<Scalar,ArrayScalar>::Basis_HCURL_HEX_I1_FEM()
00040 {
00041 this -> basisCardinality_ = 12;
00042 this -> basisDegree_ = 1;
00043 this -> basisCellTopology_ = shards::CellTopology(shards::getCellTopologyData<shards::Hexahedron<8> >() );
00044 this -> basisType_ = BASIS_FEM_DEFAULT;
00045 this -> basisCoordinates_ = COORDINATES_CARTESIAN;
00046 this -> basisTagsAreSet_ = false;
00047 }
00048
00049 template<class Scalar, class ArrayScalar>
00050 void Basis_HCURL_HEX_I1_FEM<Scalar, ArrayScalar>::initializeTags() {
00051
00052
00053 int tagSize = 4;
00054 int posScDim = 0;
00055 int posScOrd = 1;
00056 int posDfOrd = 2;
00057
00058
00059 int tags[] = {
00060 1, 0, 0, 1,
00061 1, 1, 0, 1,
00062 1, 2, 0, 1,
00063 1, 3, 0, 1,
00064 1, 4, 0, 1,
00065 1, 5, 0, 1,
00066 1, 6, 0, 1,
00067 1, 7, 0, 1,
00068 1, 8, 0, 1,
00069 1, 9, 0, 1,
00070 1, 10, 0, 1,
00071 1, 11, 0, 1 };
00072
00073
00074 Intrepid::setOrdinalTagData(this -> tagToOrdinal_,
00075 this -> ordinalToTag_,
00076 tags,
00077 this -> basisCardinality_,
00078 tagSize,
00079 posScDim,
00080 posScOrd,
00081 posDfOrd);
00082 }
00083
00084
00085
00086 template<class Scalar, class ArrayScalar>
00087 void Basis_HCURL_HEX_I1_FEM<Scalar, ArrayScalar>::getValues(ArrayScalar & outputValues,
00088 const ArrayScalar & inputPoints,
00089 const EOperator operatorType) const {
00090
00091
00092 #ifdef HAVE_INTREPID_DEBUG
00093 Intrepid::getValues_HCURL_Args<Scalar, ArrayScalar>(outputValues,
00094 inputPoints,
00095 operatorType,
00096 this -> getBaseCellTopology(),
00097 this -> getCardinality() );
00098 #endif
00099
00100
00101 int dim0 = inputPoints.dimension(0);
00102
00103
00104 Scalar x = 0.0;
00105 Scalar y = 0.0;
00106 Scalar z = 0.0;
00107
00108 switch (operatorType) {
00109 case OPERATOR_VALUE:
00110 for (int i0 = 0; i0 < dim0; i0++) {
00111 x = inputPoints(i0, 0);
00112 y = inputPoints(i0, 1);
00113 z = inputPoints(i0, 2);
00114
00115
00116 outputValues(0, i0, 0) = (1.0 - y)*(1.0 - z)/8.0;
00117 outputValues(0, i0, 1) = 0.0;
00118 outputValues(0, i0, 2) = 0.0;
00119
00120 outputValues(1, i0, 0) = 0.0;
00121 outputValues(1, i0, 1) = (1.0 + x)*(1.0 - z)/8.0;
00122 outputValues(1, i0, 2) = 0.0;
00123
00124 outputValues(2, i0, 0) = -(1.0 + y)*(1.0 - z)/8.0;
00125 outputValues(2, i0, 1) = 0.0;
00126 outputValues(2, i0, 2) = 0.0;
00127
00128 outputValues(3, i0, 0) = 0.0;
00129 outputValues(3, i0, 1) = -(1.0 - x)*(1.0 - z)/8.0;
00130 outputValues(3, i0, 2) = 0.0;
00131
00132 outputValues(4, i0, 0) = (1.0 - y)*(1.0 + z)/8.0;
00133 outputValues(4, i0, 1) = 0.0;
00134 outputValues(4, i0, 2) = 0.0;
00135
00136 outputValues(5, i0, 0) = 0.0;
00137 outputValues(5, i0, 1) = (1.0 + x)*(1.0 + z)/8.0;
00138 outputValues(5, i0, 2) = 0.0;
00139
00140 outputValues(6, i0, 0) = -(1.0 + y)*(1.0 + z)/8.0;
00141 outputValues(6, i0, 1) = 0.0;
00142 outputValues(6, i0, 2) = 0.0;
00143
00144 outputValues(7, i0, 0) = 0.0;
00145 outputValues(7, i0, 1) = -(1.0 - x)*(1.0 + z)/8.0;
00146 outputValues(7, i0, 2) = 0.0;
00147
00148 outputValues(8, i0, 0) = 0.0;
00149 outputValues(8, i0, 1) = 0.0;
00150 outputValues(8, i0, 2) = (1.0 - x)*(1.0 - y)/8.0;
00151
00152 outputValues(9, i0, 0) = 0.0;
00153 outputValues(9, i0, 1) = 0.0;
00154 outputValues(9, i0, 2) = (1.0 + x)*(1.0 - y)/8.0;
00155
00156 outputValues(10, i0, 0) = 0.0;
00157 outputValues(10, i0, 1) = 0.0;
00158 outputValues(10, i0, 2) = (1.0 + x)*(1.0 + y)/8.0;
00159
00160 outputValues(11, i0, 0) = 0.0;
00161 outputValues(11, i0, 1) = 0.0;
00162 outputValues(11, i0, 2) = (1.0 - x)*(1.0 + y)/8.0;
00163 }
00164 break;
00165
00166 case OPERATOR_CURL:
00167 for (int i0 = 0; i0 < dim0; i0++) {
00168 x = inputPoints(i0, 0);
00169 y = inputPoints(i0, 1);
00170 z = inputPoints(i0, 2);
00171
00172
00173 outputValues(0, i0, 0) = 0.0;
00174 outputValues(0, i0, 1) = -(1.0 - y)/8.0;
00175 outputValues(0, i0, 2) = (1.0 - z)/8.0;
00176
00177 outputValues(1, i0, 0) = (1.0 + x)/8.0;
00178 outputValues(1, i0, 1) = 0.0;
00179 outputValues(1, i0, 2) = (1.0 - z)/8.0;
00180
00181 outputValues(2, i0, 0) = 0.0;
00182 outputValues(2, i0, 1) = (1.0 + y)/8.0;
00183 outputValues(2, i0, 2) = (1.0 - z)/8.0;
00184
00185 outputValues(3, i0, 0) = -(1.0 - x)/8.0;
00186 outputValues(3, i0, 1) = 0.0;
00187 outputValues(3, i0, 2) = (1.0 - z)/8.0;
00188
00189 outputValues(4, i0, 0) = 0.0;
00190 outputValues(4, i0, 1) = (1.0 - y)/8.0;
00191 outputValues(4, i0, 2) = (1.0 + z)/8.0;
00192
00193 outputValues(5, i0, 0) = -(1.0 + x)/8.0;
00194 outputValues(5, i0, 1) = 0.0;
00195 outputValues(5, i0, 2) = (1.0 + z)/8.0;
00196
00197 outputValues(6, i0, 0) = 0.0;
00198 outputValues(6, i0, 1) = -(1.0 + y)/8.0;
00199 outputValues(6, i0, 2) = (1.0 + z)/8.0;
00200
00201 outputValues(7, i0, 0) = (1.0 - x)/8.0;
00202 outputValues(7, i0, 1) = 0.0;
00203 outputValues(7, i0, 2) = (1.0 + z)/8.0;
00204
00205 outputValues(8, i0, 0) = -(1.0 - x)/8.0;
00206 outputValues(8, i0, 1) = (1.0 - y)/8.0;
00207 outputValues(8, i0, 2) = 0.0;
00208
00209 outputValues(9, i0, 0) = -(1.0 + x)/8.0;
00210 outputValues(9, i0, 1) = -(1.0 - y)/8.0;
00211 outputValues(9, i0, 2) = 0.0;
00212
00213 outputValues(10, i0, 0) = (1.0 + x)/8.0;
00214 outputValues(10, i0, 1) = -(1.0 + y)/8.0;
00215 outputValues(10, i0, 2) = 0.0;
00216
00217 outputValues(11, i0, 0) = (1.0 - x)/8.0;
00218 outputValues(11, i0, 1) = (1.0 + y)/8.0;
00219 outputValues(11, i0, 2) = 0.0;
00220 }
00221 break;
00222
00223 case OPERATOR_DIV:
00224 TEST_FOR_EXCEPTION( (operatorType == OPERATOR_DIV), std::invalid_argument,
00225 ">>> ERROR (Basis_HCURL_HEX_I1_FEM): DIV is invalid operator for HCURL Basis Functions");
00226 break;
00227
00228 case OPERATOR_GRAD:
00229 TEST_FOR_EXCEPTION( (operatorType == OPERATOR_GRAD), std::invalid_argument,
00230 ">>> ERROR (Basis_HCURL_HEX_I1_FEM): GRAD is invalid operator for HCURL Basis Functions");
00231 break;
00232
00233 case OPERATOR_D1:
00234 case OPERATOR_D2:
00235 case OPERATOR_D3:
00236 case OPERATOR_D4:
00237 case OPERATOR_D5:
00238 case OPERATOR_D6:
00239 case OPERATOR_D7:
00240 case OPERATOR_D8:
00241 case OPERATOR_D9:
00242 case OPERATOR_D10:
00243 TEST_FOR_EXCEPTION( ( (operatorType == OPERATOR_D1) ||
00244 (operatorType == OPERATOR_D2) ||
00245 (operatorType == OPERATOR_D3) ||
00246 (operatorType == OPERATOR_D4) ||
00247 (operatorType == OPERATOR_D5) ||
00248 (operatorType == OPERATOR_D6) ||
00249 (operatorType == OPERATOR_D7) ||
00250 (operatorType == OPERATOR_D8) ||
00251 (operatorType == OPERATOR_D9) ||
00252 (operatorType == OPERATOR_D10) ),
00253 std::invalid_argument,
00254 ">>> ERROR (Basis_HCURL_HEX_I1_FEM): Invalid operator type");
00255 break;
00256
00257 default:
00258 TEST_FOR_EXCEPTION( ( (operatorType != OPERATOR_VALUE) &&
00259 (operatorType != OPERATOR_GRAD) &&
00260 (operatorType != OPERATOR_CURL) &&
00261 (operatorType != OPERATOR_DIV) &&
00262 (operatorType != OPERATOR_D1) &&
00263 (operatorType != OPERATOR_D2) &&
00264 (operatorType != OPERATOR_D3) &&
00265 (operatorType != OPERATOR_D4) &&
00266 (operatorType != OPERATOR_D5) &&
00267 (operatorType != OPERATOR_D6) &&
00268 (operatorType != OPERATOR_D7) &&
00269 (operatorType != OPERATOR_D8) &&
00270 (operatorType != OPERATOR_D9) &&
00271 (operatorType != OPERATOR_D10) ),
00272 std::invalid_argument,
00273 ">>> ERROR (Basis_HCURL_HEX_I1_FEM): Invalid operator type");
00274 }
00275 }
00276
00277
00278
00279 template<class Scalar, class ArrayScalar>
00280 void Basis_HCURL_HEX_I1_FEM<Scalar, ArrayScalar>::getValues(ArrayScalar& outputValues,
00281 const ArrayScalar & inputPoints,
00282 const ArrayScalar & cellVertices,
00283 const EOperator operatorType) const {
00284 TEST_FOR_EXCEPTION( (true), std::logic_error,
00285 ">>> ERROR (Basis_HCURL_HEX_I1_FEM): FEM Basis calling an FVD member function");
00286 }
00287
00288 }