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 ArrayScalar>
00039 Basis_HGRAD_LINE_Cn_FEM_JACOBI<Scalar,ArrayScalar>::Basis_HGRAD_LINE_Cn_FEM_JACOBI(int order, Scalar alpha, Scalar beta) {
00040 this -> basisCardinality_ = order+1;
00041 this -> basisDegree_ = order;
00042 this -> jacobiAlpha_ = alpha;
00043 this -> jacobiBeta_ = beta;
00044 this -> basisCellTopology_ = shards::CellTopology(shards::getCellTopologyData<shards::Line<> >() );
00045 this -> basisType_ = BASIS_FEM_HIERARCHICAL;
00046 this -> basisCoordinates_ = COORDINATES_CARTESIAN;
00047 this -> basisTagsAreSet_ = false;
00048 }
00049
00050
00051
00052 template<class Scalar, class ArrayScalar>
00053 void Basis_HGRAD_LINE_Cn_FEM_JACOBI<Scalar, ArrayScalar>::getValues(ArrayScalar & outputValues,
00054 const ArrayScalar & inputPoints,
00055 const EOperator operatorType) const {
00056
00057
00058 #ifdef HAVE_INTREPID_DEBUG
00059 Intrepid::getValues_HGRAD_Args<Scalar, ArrayScalar>(outputValues,
00060 inputPoints,
00061 operatorType,
00062 this -> getBaseCellTopology(),
00063 this -> getCardinality() );
00064 #endif
00065
00066
00067 int numPoints = inputPoints.dimension(0);
00068
00069 Teuchos::Array<Scalar> tmpPoints(numPoints);
00070 Teuchos::Array<Scalar> jacobiPolyAtPoints(numPoints);
00071
00072
00073 for (int i=0; i<numPoints; i++) {
00074 tmpPoints[i] = inputPoints(i, 0);
00075 }
00076
00077 switch (operatorType) {
00078
00079 case OPERATOR_VALUE: {
00080 for (int ord = 0; ord < this -> basisCardinality_; ord++) {
00081 IntrepidPolylib::jacobfd(numPoints, &tmpPoints[0], &jacobiPolyAtPoints[0], (Scalar*)0, ord, jacobiAlpha_, jacobiBeta_);
00082 for (int pt = 0; pt < numPoints; pt++) {
00083
00084 outputValues(ord, pt) = jacobiPolyAtPoints[pt];
00085 }
00086 }
00087 }
00088 break;
00089
00090 case OPERATOR_GRAD:
00091 case OPERATOR_CURL:
00092 case OPERATOR_DIV:
00093 case OPERATOR_D1: {
00094 for (int ord = 0; ord < this -> basisCardinality_; ord++) {
00095 IntrepidPolylib::jacobd(numPoints, &tmpPoints[0], &jacobiPolyAtPoints[0], ord, jacobiAlpha_, jacobiBeta_);
00096 for (int pt = 0; pt < numPoints; pt++) {
00097
00098 outputValues(ord, pt, 0) = jacobiPolyAtPoints[pt];
00099 }
00100 }
00101 }
00102 break;
00103
00104 case OPERATOR_D2:
00105 case OPERATOR_D3:
00106 case OPERATOR_D4:
00107 case OPERATOR_D5:
00108 case OPERATOR_D6:
00109 case OPERATOR_D7:
00110 case OPERATOR_D8:
00111 case OPERATOR_D9:
00112 case OPERATOR_D10: {
00113 TEST_FOR_EXCEPTION( 1, std::invalid_argument,
00114 ">>> ERROR (Basis_HGRAD_LINE_Cn_FEM_JACOBI): Higher-order (>1st) derivatives not implemented.");
00115 }
00116 break;
00117
00118 default:
00119 TEST_FOR_EXCEPTION( !( Intrepid::isValidOperator(operatorType) ), std::invalid_argument,
00120 ">>> ERROR (Basis_HGRAD_LINE_Cn_FEM_JACOBI): Invalid operator type.");
00121 }
00122 }
00123
00124
00125
00126 template<class Scalar, class ArrayScalar>
00127 void Basis_HGRAD_LINE_Cn_FEM_JACOBI<Scalar, ArrayScalar>::getValues(ArrayScalar& outputValues,
00128 const ArrayScalar & inputPoints,
00129 const ArrayScalar & cellVertices,
00130 const EOperator operatorType) const {
00131 TEST_FOR_EXCEPTION( (true), std::logic_error,
00132 ">>> ERROR (Basis_HGRAD_LINE_Cn_FEM_JACOBI): FEM Basis calling an FVD member function");
00133 }
00134
00135
00136
00137 template<class Scalar, class ArrayScalar>
00138 void Basis_HGRAD_LINE_Cn_FEM_JACOBI<Scalar, ArrayScalar>::setBasisParameters(int n, Scalar alpha, Scalar beta) {
00139 this -> basisCardinality_ = n+1;
00140 this -> basisDegree_ = n;
00141 this -> jacobiAlpha_ = alpha;
00142 this -> jacobiBeta_ = beta;
00143 this -> initializeTags();
00144 }
00145
00146
00147
00148 template<class Scalar, class ArrayScalar>
00149 void Basis_HGRAD_LINE_Cn_FEM_JACOBI<Scalar, ArrayScalar>::initializeTags() {
00150
00151
00152
00153 int tagSize = 4;
00154 int posScDim = 0;
00155 int posScOrd = 1;
00156 int posDfOrd = 2;
00157
00158 FieldContainer<int> tags(this->basisCardinality_, 4);
00159
00160 for (int i=0; i < this->basisCardinality_; i++) {
00161 tags(i, 0) = 1;
00162 tags(i, 1) = 0;
00163 tags(i, 2) = i;
00164 tags(i, 3) = this->basisCardinality_;
00165 }
00166
00167
00168 Intrepid::setOrdinalTagData(this -> tagToOrdinal_,
00169 this -> ordinalToTag_,
00170 &tags[0],
00171 this -> basisCardinality_,
00172 tagSize,
00173 posScDim,
00174 posScOrd,
00175 posDfOrd);
00176 }
00177
00178 }