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_TET_I1_FEM<Scalar,ArrayScalar>::Basis_HCURL_TET_I1_FEM()
00040 {
00041 this -> basisCardinality_ = 6;
00042 this -> basisDegree_ = 1;
00043 this -> basisCellTopology_ = shards::CellTopology(shards::getCellTopologyData<shards::Tetrahedron<4> >() );
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_TET_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
00067
00068 Intrepid::setOrdinalTagData(this -> tagToOrdinal_,
00069 this -> ordinalToTag_,
00070 tags,
00071 this -> basisCardinality_,
00072 tagSize,
00073 posScDim,
00074 posScOrd,
00075 posDfOrd);
00076 }
00077
00078
00079
00080 template<class Scalar, class ArrayScalar>
00081 void Basis_HCURL_TET_I1_FEM<Scalar, ArrayScalar>::getValues(ArrayScalar & outputValues,
00082 const ArrayScalar & inputPoints,
00083 const EOperator operatorType) const {
00084
00085
00086 #ifdef HAVE_INTREPID_DEBUG
00087 Intrepid::getValues_HCURL_Args<Scalar, ArrayScalar>(outputValues,
00088 inputPoints,
00089 operatorType,
00090 this -> getBaseCellTopology(),
00091 this -> getCardinality() );
00092 #endif
00093
00094
00095 int dim0 = inputPoints.dimension(0);
00096
00097
00098 Scalar x = 0.0;
00099 Scalar y = 0.0;
00100 Scalar z = 0.0;
00101
00102 switch (operatorType) {
00103 case OPERATOR_VALUE:
00104 for (int i0 = 0; i0 < dim0; i0++) {
00105 x = inputPoints(i0, 0);
00106 y = inputPoints(i0, 1);
00107 z = inputPoints(i0, 2);
00108
00109
00110 outputValues(0, i0, 0) = 1.0 - y - z;
00111 outputValues(0, i0, 1) = x;
00112 outputValues(0, i0, 2) = x;
00113
00114 outputValues(1, i0, 0) =-y;
00115 outputValues(1, i0, 1) = x;
00116 outputValues(1, i0, 2) = 0.0;
00117
00118 outputValues(2, i0, 0) = -y;
00119 outputValues(2, i0, 1) = -1.0 + x + z;
00120 outputValues(2, i0, 2) = -y;
00121
00122 outputValues(3, i0, 0) = z;
00123 outputValues(3, i0, 1) = z;
00124 outputValues(3, i0, 2) = 1.0 - x - y;
00125
00126 outputValues(4, i0, 0) =-z;
00127 outputValues(4, i0, 1) = 0.0;
00128 outputValues(4, i0, 2) = x;
00129
00130 outputValues(5, i0, 0) = 0.0;
00131 outputValues(5, i0, 1) =-z;
00132 outputValues(5, i0, 2) = y;
00133 }
00134 break;
00135
00136 case OPERATOR_CURL:
00137 for (int i0 = 0; i0 < dim0; i0++) {
00138 x = inputPoints(i0, 0);
00139 y = inputPoints(i0, 1);
00140 z = inputPoints(i0, 2);
00141
00142
00143 outputValues(0, i0, 0) = 0.0;
00144 outputValues(0, i0, 1) =-2.0;
00145 outputValues(0, i0, 2) = 2.0;
00146
00147 outputValues(1, i0, 0) = 0.0;
00148 outputValues(1, i0, 1) = 0.0;
00149 outputValues(1, i0, 2) = 2.0;
00150
00151 outputValues(2, i0, 0) =-2.0;
00152 outputValues(2, i0, 1) = 0.0;
00153 outputValues(2, i0, 2) = 2.0;
00154
00155 outputValues(3, i0, 0) =-2.0;
00156 outputValues(3, i0, 1) = 2.0;
00157 outputValues(3, i0, 2) = 0.0;
00158
00159 outputValues(4, i0, 0) = 0.0;
00160 outputValues(4, i0, 1) =-2.0;
00161 outputValues(4, i0, 2) = 0.0;
00162
00163 outputValues(5, i0, 0) = 2.0;
00164 outputValues(5, i0, 1) = 0.0;
00165 outputValues(5, i0, 2) = 0.0;
00166 }
00167 break;
00168
00169 case OPERATOR_DIV:
00170 TEST_FOR_EXCEPTION( (operatorType == OPERATOR_DIV), std::invalid_argument,
00171 ">>> ERROR (Basis_HCURL_TET_I1_FEM): DIV is invalid operator for HCURL Basis Functions");
00172 break;
00173
00174 case OPERATOR_GRAD:
00175 TEST_FOR_EXCEPTION( (operatorType == OPERATOR_GRAD), std::invalid_argument,
00176 ">>> ERROR (Basis_HCURL_TET_I1_FEM): GRAD is invalid operator for HCURL Basis Functions");
00177 break;
00178
00179 case OPERATOR_D1:
00180 case OPERATOR_D2:
00181 case OPERATOR_D3:
00182 case OPERATOR_D4:
00183 case OPERATOR_D5:
00184 case OPERATOR_D6:
00185 case OPERATOR_D7:
00186 case OPERATOR_D8:
00187 case OPERATOR_D9:
00188 case OPERATOR_D10:
00189 TEST_FOR_EXCEPTION( ( (operatorType == OPERATOR_D1) ||
00190 (operatorType == OPERATOR_D2) ||
00191 (operatorType == OPERATOR_D3) ||
00192 (operatorType == OPERATOR_D4) ||
00193 (operatorType == OPERATOR_D5) ||
00194 (operatorType == OPERATOR_D6) ||
00195 (operatorType == OPERATOR_D7) ||
00196 (operatorType == OPERATOR_D8) ||
00197 (operatorType == OPERATOR_D9) ||
00198 (operatorType == OPERATOR_D10) ),
00199 std::invalid_argument,
00200 ">>> ERROR (Basis_HCURL_TET_I1_FEM): Invalid operator type");
00201 break;
00202
00203 default:
00204 TEST_FOR_EXCEPTION( ( (operatorType != OPERATOR_VALUE) &&
00205 (operatorType != OPERATOR_GRAD) &&
00206 (operatorType != OPERATOR_CURL) &&
00207 (operatorType != OPERATOR_DIV) &&
00208 (operatorType != OPERATOR_D1) &&
00209 (operatorType != OPERATOR_D2) &&
00210 (operatorType != OPERATOR_D3) &&
00211 (operatorType != OPERATOR_D4) &&
00212 (operatorType != OPERATOR_D5) &&
00213 (operatorType != OPERATOR_D6) &&
00214 (operatorType != OPERATOR_D7) &&
00215 (operatorType != OPERATOR_D8) &&
00216 (operatorType != OPERATOR_D9) &&
00217 (operatorType != OPERATOR_D10) ),
00218 std::invalid_argument,
00219 ">>> ERROR (Basis_HCURL_TET_I1_FEM): Invalid operator type");
00220 }
00221 }
00222
00223
00224
00225 template<class Scalar, class ArrayScalar>
00226 void Basis_HCURL_TET_I1_FEM<Scalar, ArrayScalar>::getValues(ArrayScalar& outputValues,
00227 const ArrayScalar & inputPoints,
00228 const ArrayScalar & cellVertices,
00229 const EOperator operatorType) const {
00230 TEST_FOR_EXCEPTION( (true), std::logic_error,
00231 ">>> ERROR (Basis_HCURL_TET_I1_FEM): FEM Basis calling an FVD member function");
00232 }
00233
00234 }