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_C1_FEM<Scalar,ArrayScalar>::Basis_HGRAD_LINE_C1_FEM() {
00040 this -> basisCardinality_ = 2;
00041 this -> basisDegree_ = 1;
00042 this -> basisCellTopology_ = shards::CellTopology(shards::getCellTopologyData<shards::Line<2> >() );
00043 this -> basisType_ = BASIS_FEM_DEFAULT;
00044 this -> basisCoordinates_ = COORDINATES_CARTESIAN;
00045 this -> basisTagsAreSet_ = false;
00046 }
00047
00048
00049
00050 template<class Scalar, class ArrayScalar>
00051 void Basis_HGRAD_LINE_C1_FEM<Scalar, ArrayScalar>::getValues(ArrayScalar & outputValues,
00052 const ArrayScalar & inputPoints,
00053 const EOperator operatorType) const {
00054
00055
00056 #ifdef HAVE_INTREPID_DEBUG
00057 Intrepid::getValues_HGRAD_Args<Scalar, ArrayScalar>(outputValues,
00058 inputPoints,
00059 operatorType,
00060 this -> getBaseCellTopology(),
00061 this -> getCardinality() );
00062 #endif
00063
00064 int dim0 = inputPoints.dimension(0);
00065
00066
00067 Scalar x = 0.0;
00068
00069 switch (operatorType) {
00070
00071 case OPERATOR_VALUE:
00072 for (int i0 = 0; i0 < dim0; i0++) {
00073 x = inputPoints(i0, 0);
00074
00075
00076 outputValues(0, i0) = (1.0 - x)/2.0;
00077 outputValues(1, i0) = (1.0 + x)/2.0;
00078 }
00079 break;
00080
00081 case OPERATOR_GRAD:
00082 case OPERATOR_DIV:
00083 case OPERATOR_CURL:
00084 case OPERATOR_D1:
00085 for (int i0 = 0; i0 < dim0; i0++) {
00086 x = inputPoints(i0,0);
00087
00088
00089 outputValues(0, i0, 0) = -0.5;
00090 outputValues(1, i0, 0) = 0.5;
00091 }
00092 break;
00093
00094 case OPERATOR_D2:
00095 for (int i0 = 0; i0 < dim0; i0++) {
00096
00097
00098 outputValues(0, i0, 0) = 0.0;
00099 outputValues(1, i0, 0) = 0.0;
00100 }
00101 break;
00102
00103 case OPERATOR_D3:
00104 case OPERATOR_D4:
00105 case OPERATOR_D5:
00106 case OPERATOR_D6:
00107 case OPERATOR_D7:
00108 case OPERATOR_D8:
00109 case OPERATOR_D9:
00110 case OPERATOR_D10:
00111 {
00112
00113 int DkCardinality = Intrepid::getDkCardinality(operatorType,
00114 this -> basisCellTopology_.getDimension() );
00115 for(int dofOrd = 0; dofOrd < this -> basisCardinality_; dofOrd++) {
00116 for (int i0 = 0; i0 < dim0; i0++) {
00117 for(int dkOrd = 0; dkOrd < DkCardinality; dkOrd++){
00118 outputValues(dofOrd, i0, dkOrd) = 0.0;
00119 }
00120 }
00121 }
00122 }
00123 break;
00124
00125 default:
00126 TEST_FOR_EXCEPTION( !( Intrepid::isValidOperator(operatorType) ), std::invalid_argument,
00127 ">>> ERROR (Basis_HGRAD_LINE_C1_FEM): Invalid operator type");
00128 }
00129 }
00130
00131 template<class Scalar, class ArrayScalar>
00132 void Basis_HGRAD_LINE_C1_FEM<Scalar, ArrayScalar>::initializeTags() {
00133
00134
00135 int tagSize = 4;
00136 int posScDim = 0;
00137 int posScOrd = 1;
00138 int posDfOrd = 2;
00139
00140
00141 int tags[] = { 0, 0, 0, 1,
00142 0, 1, 0, 1};
00143
00144
00145 Intrepid::setOrdinalTagData(this -> tagToOrdinal_,
00146 this -> ordinalToTag_,
00147 tags,
00148 this -> basisCardinality_,
00149 tagSize,
00150 posScDim,
00151 posScOrd,
00152 posDfOrd);
00153 }
00154
00155 template<class Scalar, class ArrayScalar>
00156 void Basis_HGRAD_LINE_C1_FEM<Scalar, ArrayScalar>::getValues(ArrayScalar& outputValues,
00157 const ArrayScalar & inputPoints,
00158 const ArrayScalar & cellVertices,
00159 const EOperator operatorType) const {
00160 TEST_FOR_EXCEPTION( (true), std::logic_error,
00161 ">>> ERROR (Basis_HGRAD_LINE_C1_FEM): FEM Basis calling an FVD member function");
00162 }
00163
00164 }